CPS-J/S冲奖第15天:真题解析

360影视 动漫周边 2025-03-13 03:50 8

摘要:第1天:1枚金币。接下来的2天(第2、3天):每天2枚。接下来的3天(第4、5、6天):每天3枚。接下来的4天(第7-10天):每天4枚。依此类推,每个阶段的天数等于当前阶段的金币数。

解题思路

理解工资发放规律

第1天:1枚金币。接下来的2天(第2、3天):每天2枚。接下来的3天(第4、5、6天):每天3枚。接下来的4天(第7-10天):每天4枚。依此类推,每个阶段的天数等于当前阶段的金币数。

分解阶段计算

每个阶段 n 持续 n 天,每天发放 n 枚金币。当总天数未达到 k 时,累加完整阶段的金币。若最后阶段天数不足,则按剩余天数计算。

循环累加

使用循环逐个处理每个阶段,直到总天数超过 k。对于完整阶段,直接累加 n*n。对于不完整阶段,累加剩余天数乘以当前阶段的金币数。

代码实现

#include
usingnamespacestd;

intmain{
int k;
cin >> k;

longlong 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;
return0;
}

代码解析

变量初始化

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。

总结

时间复杂度:循环次数约为 ,效率极高。空间复杂度:仅使用常数级额外空间。关键点:通过数学规律分解阶段,避免逐天计算,提升效率。

来源:莉姿教育

相关推荐