c++习题10-骑士得到的金币数

目录

 一,题目

二,思路 

三,代码 


 

 一,题目

二,思路 

阅读题目之后可以列出如下的数字👇 

观察上图有如下思路(主要是找到规律) 

  1. 给个for循环包裹住需要处理的语句,循环次数为骑士工作的总天数n(或者是给个while循环,循环结束条件当前天数dt大于骑士工作的总天数n)
  2. 通过上图可以发现,当前金币数dj开始变化分别是在当前天数dt为1 2 4 7 11的位置,可以得到规律:当前天数dt等于之前的当前天数dt加上接下来天数jt,即dt+=jt;并且当前金币数dj在自增,即dj++;
  3. 因为指定的总天数n不一定能够和接下来的天数相等,例如指定n=2,总共两天,接下来1天1金币,接下来2天2金币,并且在接下来的2天中,并没有到达2天,只有1天。金币数只有3,没有4,所以接下来的天数jt在运算过程中并不能直接和当前金币数dj等同,不能列出错误的等式:jt=dj;
  4. 通过上面第二步,可以知道的是,接下来天数与金币数及经过天数都有关,并且接下来天数取的是最小的那个(例如接下来的天数只有3天,金币数每天都是有4个),列出等式:jt=min(dj,n-dt+1);
  5. 骑士得到的金币总数sum就是每一次都加上接下来天数乘上当前金币数,即sum+=jt*dj;

三,代码 

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,sum=0,dt=1,dj=1;
	cin >> n; 
	for(int i=0;i<n;i++)
	{  
		int jt=min(dj,n-dt+1);
		sum+=jt*dj;
		dt+=jt;
		dj++;
	}
	cout<<sum;
	return 0;
}

 有问题请在评论区留言或者是私信我,回复时间不超过一天。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值