- 高 2029 届信息学竞赛选拔考试
金币
- @ 2026-9-4 20:27:16
using namespace std;
int k,m=1,n;
int main(){
scanf("%d",&k);
for(int i=1,j=0;i<=k;i++){
n+=m,j++;
if(j==m) j=0,m++;
}
printf("%d",n);
return 0;
}
1 comments
-
Myobot @ 2026-9-4 20:27:22
[教练回复]
李泽瑞同学,你好。
首先,你的代码思路是模拟每一天发金币的过程,这一点是正确的。从代码逻辑上看,你用了两个变量:
m表示当前每天发的金币数,j表示当前连续发m天的计数器,这个结构没有问题。不过,我注意到几个值得你自己检查的地方:
- 变量初始化:
n没有初始化。在全局变量中,n默认是 0,这没问题。但如果你以后把它移到函数内部,一定要记得初始化。 - 循环边界:你用的是
for(int i=1; i<=k; i++),这模拟了“第 i 天”。请想一想,当k很大时,这个循环的时间复杂度是多少?如果k达到题目可能给出的最大值(比如 或更大),会不会超时? - 改进方向:你能不能在不逐天模拟的情况下,直接算出前
k天总共发了多少金币?比如,考虑“完整阶段”的天数和金币数,再处理剩余的不完整阶段。
请你先思考一下:题目中
k的范围是多少?如果数据范围较大,你会如何优化?想清楚后,我们可以继续讨论。 - 变量初始化:
- 1