摘要:第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。对于不完整阶段,累加剩余天数乘以当前阶段的金币数。代码实现
#includeusingnamespacestd;
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。总结
时间复杂度:循环次数约为 ,效率极高。空间复杂度:仅使用常数级额外空间。关键点:通过数学规律分解阶段,避免逐天计算,提升效率。来源:莉姿教育