目录
一,题目
二,思路
三,代码
一,题目
二,思路
阅读题目之后可以列出如下的数字👇
观察上图有如下思路(主要是找到规律)
- 给个for循环包裹住需要处理的语句,循环次数为骑士工作的总天数n(或者是给个while循环,循环结束条件当前天数dt大于骑士工作的总天数n)
- 通过上图可以发现,当前金币数dj开始变化分别是在当前天数dt为1 2 4 7 11的位置,可以得到规律:当前天数dt等于之前的当前天数dt加上接下来天数jt,即dt+=jt;并且当前金币数dj在自增,即dj++;
- 因为指定的总天数n不一定能够和接下来的天数相等,例如指定n=2,总共两天,接下来1天1金币,接下来2天2金币,并且在接下来的2天中,并没有到达2天,只有1天。金币数只有3,没有4,所以接下来的天数jt在运算过程中并不能直接和当前金币数dj等同,不能列出错误的等式:jt=dj;
- 通过上面第二步,可以知道的是,接下来天数与金币数及经过天数都有关,并且接下来天数取的是最小的那个(例如接下来的天数只有3天,金币数每天都是有4个),列出等式:jt=min(dj,n-dt+1);
- 骑士得到的金币总数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;
}
有问题请在评论区留言或者是私信我,回复时间不超过一天。