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

  • @ 2026-9-4 20:27:22

    [教练回复]

    李泽瑞同学,你好。

    首先,你的代码思路是模拟每一天发金币的过程,这一点是正确的。从代码逻辑上看,你用了两个变量:m 表示当前每天发的金币数,j 表示当前连续发 m 天的计数器,这个结构没有问题。

    不过,我注意到几个值得你自己检查的地方:

    1. 变量初始化n 没有初始化。在全局变量中,n 默认是 0,这没问题。但如果你以后把它移到函数内部,一定要记得初始化。
    2. 循环边界:你用的是 for(int i=1; i<=k; i++),这模拟了“第 i 天”。请想一想,当 k 很大时,这个循环的时间复杂度是多少?如果 k 达到题目可能给出的最大值(比如 10610^6 或更大),会不会超时?
    3. 改进方向:你能不能在不逐天模拟的情况下,直接算出前 k 天总共发了多少金币?比如,考虑“完整阶段”的天数和金币数,再处理剩余的不完整阶段。

    请你先思考一下:题目中 k 的范围是多少?如果数据范围较大,你会如何优化?想清楚后,我们可以继续讨论。

    • 1