【题目描述】
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
【输入】
只有1行,包含一个正整数K,表示发放金币的天数。
【输出】
只有1行,包含一个正整数,即骑士收到的金币数。
【输入样例】
6
【输出样例】
14
【提示】
样例测试点#2
输入:
1000
输出:
29820
【解题思路】
解题步骤
-
初始化变量:
total
:用于累积总金币数。coins
:当前阶段每天发放的金币数。days
:当前阶段连续发放的天数。day_count
:迄今为止处理的总天数。
-
累积金币:
- 使用一个循环来逐阶段累加金币,直到覆盖所有 K 天。
- 在每次循环中,首先检查加上当前阶段的天数后是否超过 K。如果超过,则调整
days
以仅包括剩余的天数。 - 然后,将这个阶段的金币(
coins * days
)加到总金币数total
上。 - 更新
day_count
以包含这个阶段的天数。
-
更新阶段:
- 每完成一个阶段后,增加每天的金币数 (
coins++
) 和接下来的天数 (days++
)。
- 每完成一个阶段后,增加每天的金币数 (
-
输出结果:
- 输出累积的总金币数
total
。
- 输出累积的总金币数
示例说明
假设 K=6,解题步骤如下:
- 初始设置:
total=0, coins=1, days=1, day_count=0
。 - 第1天:发放 1 枚金币。更新
total=1
,day_count=1
,然后coins=2
,days=2
。 - 第2-3天:每天发放 2 枚金币,共 4 枚。更新
total=5
,day_count=3
,然后coins=3
,days=3
。 - 第4-6天:每天发放 3 枚金币,共 9 枚。更新
total=14
,day_count=6
。
【代码实现】
#include <iostream>
using namespace std;
int main() {
int K; // K 表示总天数,即我们需要计算金币数的天数
cin >> K; // 从标准输入读取总天数 K
int total = 0; // total 用来累计总金币数
int coins = 1; // coins 表示当前阶段每天发放的金币数
int days = 1; // days 表示当前阶段连续发放的天数
int day_count = 0; // day_count 用来记录已经处理过的天数
// 使用循环逐阶段累加金币,直到覆盖所有 K 天
while (day_count < K) {
// 如果加上当前阶段的天数后超过 K,则只需要计算到 K 天
if (day_count + days > K) {
days = K - day_count; // 调整当前阶段的天数,仅计算剩余天数
}
// 计算并累加当前阶段的金币数
total += coins * days; // 当前阶段的金币数 = 每天金币数 * 当前阶段天数
day_count += days; // 更新已处理的天数
// 更新到下一阶段的金币数和天数
coins++; // 每个阶段每天的金币数递增
days++; // 每个阶段的天数也递增
}
cout << total << endl; // 输出计算得到的总金币数
return 0;
}
【重难点分析】
重点
-
理解金币发放规律:核心重点在于理解题目描述的金币发放模式。金币发放以特定的周期性增长方式进行,即第 N 天发放 N 枚金币持续 N 天,然后递增到 N+1 枚持续 N+1 天,以此类推。需要准确理解这一模式以便在编程中实现。
-
累积金币计算:基于给定的天数 K,计算出在这些天内总共发放的金币数。这要求程序能够正确累加每个阶段的金币总数,同时在最后一个不完整的阶段能正确处理剩余天数的金币计算。
难点
-
处理不完整的阶段:当天数 K 不能完全匹配当前的发放阶段时,需要特别处理这一部分。这涉及到在当前阶段中计算只有部分天数的情况,确保这部分的金币正确累加,而不是按完整阶段来计算。
-
变量更新和循环控制:在循环中逐步更新金币数和天数,同时确保循环在达到总天数 K 时正确结束。这需要仔细设计循环的条件和内部的变量更新策略。
解决策略
- 理解规则:首先彻底理解题目的金币发放规则。
- 模拟实现:使用循环结构模拟金币发放的整个过程,通过条件判断处理不完整阶段。