购物网站建设需要多少钱友情链接的网站有哪些
解题思路
-
理解工资发放规律:
-
第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。
总结
-
时间复杂度:循环次数约为 ,效率极高。
-
空间复杂度:仅使用常数级额外空间。
-
关键点:通过数学规律分解阶段,避免逐天计算,提升效率。