CPS-J/S冲奖第15天:真题解析
解题思路
-
理解工资发放规律:
-
第1天:1枚金币。
-
接下来的2天(第2、3天):每天2枚。
-
接下来的3天(第4、5、6天):每天3枚。
-
接下来的4天(第7-10天):每天4枚。
-
依此类推,每个阶段的天数等于当前阶段的金币数。
-
-
分解阶段计算:
-
每个阶段
n
持续n
天,每天发放n
枚金币。 -
当总天数未达到
k
时,累加完整阶段的金币。 -
若最后阶段天数不足,则按剩余天数计算。
-
-
循环累加:
-
使用循环逐个处理每个阶段,直到总天数超过
k
。 -
对于完整阶段,直接累加
n*n
。 -
对于不完整阶段,累加剩余天数乘以当前阶段的金币数。
-
代码实现
#include <iostream>
using namespace std;
int main() {
int k;
cin >> k;
long long total = 0; // 总金币数
int current_days = 0; // 已累计的天数
int n = 1; // 当前阶段的金币数
while (true) {
// 如果当前阶段的n天可以全部包含在k天内
if (current_days + n <= k) {
total += n * n; // 累加n天的金币
current_days += n; // 更新已累计的天数
n++; // 进入下一阶段
}
// 否则处理剩余天数
else {
int remaining_days = k - current_days;
total += remaining_days * n;
break;
}
}
cout << total << endl;
return 0;
}
代码解析
-
变量初始化:
-
total
:记录总金币数。 -
current_days
:记录已累计的天数。 -
n
:表示当前阶段的金币数和天数。
-
-
循环处理阶段:
-
每次循环判断当前阶段
n
的n
天是否能全部包含在k
天内。 -
如果可以,累加
n*n
到总金币,并更新已累计天数。 -
如果不能,计算剩余天数并累加对应金币,结束循环。
-
-
输出结果:
-
循环结束后输出总金币数。
-
示例
输入:
5
输出:
11
解析:
-
阶段1(1天):1枚 → 总金币1。
-
阶段2(2天):每天2枚 → 总金币1+4=5。
-
阶段3剩余2天:每天3枚 → 总金币5+6=11。
总结
-
时间复杂度:循环次数约为 ,效率极高。
-
空间复杂度:仅使用常数级额外空间。
-
关键点:通过数学规律分解阶段,避免逐天计算,提升效率。