洛谷P2669 [NOIP2015 普及组] 金币
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
输入格式
一个正整数K,表示发放金币的天数。
输出格式
一个正整数,即骑士收到的金币数。
输入输出样例
输入#1
6
输出#1
14
原题链接:https://www.luogu.com.cn/problem/P2669
理解分析:
题目要求出“前K天里,骑士一共要获得的金币数”,由于金币数=1 * 1 + 2 * 2 + 3 * 3 + … + N * N(可能不会恰好N天,但可以最后减掉算多了的部分),所以关键要找出骑士在第K天里能拿到的金币数量。
代码实现:
#include <iostream>
using namespace std;
int K, M, N, m; //K 天数; M 中间比较量; N 连续N天发N枚金币; m 表示金币数
int main()
{
cin >> K;
while(M < K) //计算骑士在一天里能拿到的金币最大数N
{
N++;
M += N;
}
for(int i = 1; i <= N; i++)//连续i天拿了i枚,则连续i天里拿到金币的总数为i*i,假设有连续N天拿了N枚金币
m += i * i;
m -= (M - K) * N; //减去算多的天数里拿的金币
cout << m << endl;
return 0;
}
部分代码解释:
在写循环的代码时,一定要注意循环条件的设置,譬如这里<后面不能再加一个=。写代码细节一定要抠到位,不然就会出现WA很久却不知道为什么,激心为什么一直不能全AC。
while(M < K) //计算骑士在一天里能拿到的金币最大数N
{
N++;
M += N;
}
思考总结:
有时候在解决问题时可以从问题本身倒推回去寻找解决问题的方法。譬如本题要求金币数量,我们可以进一步思考金币数量如何求,便得出得求N的结论,再进一步思考N如何求,一步一步回推思考,最后解决问题。
编程是一门艺术!希望读者在编程中找到乐趣!
如果读者有不懂的地方或是博主有说错的地方,欢迎在下方留言!
如果觉得本文有帮助到您,请点击下方一键三连,助力一下博主!(ノ◕ω◕)ノx₍₍◡( ╹◡╹ )◡₎₎╰( ´・ω・)つ──☆✿✿✿ 感谢!感谢!