P2669 [NOIP 2015 普及组] 金币
解题思路
这道题目要求我们模拟骑士领取金币的过程,计算前k天总共获得的金币数。金币发放的规律是:
-
第1天:1枚金币
-
第2-3天:每天2枚金币(共2天)
-
第4-6天:每天3枚金币(共3天)
-
第7-10天:每天4枚金币(共4天)
-
以此类推...
我们可以观察到:
-
每个发放阶段的天数等于该阶段每天发放的金币数(n天每天发n枚)
-
需要跟踪当前处于哪个发放阶段(money变量)
-
每个阶段内部用计数器t来记录已发放的天数
#include<bits/stdc++.h> // 包含所有标准库头文件 using namespace std; int main() { int k, sum = 0; // k: 总天数; sum: 累计金币总数 cin >> k; // 输入天数k int money = 1, // 当前阶段每天发放的金币数,初始为1 t = 1; // 当前阶段已发放的天数计数器,初始为1 // 循环处理每一天 for(int i = 1; i <= k; i++) { sum += money; // 累加当天的金币 t++; // 增加当前阶段的天数计数 // 检查是否进入下一个发放阶段 if(t > money){ money++; // 每天发放的金币数增加 t = 1; // 重置阶段天数计数器 } } cout << sum; // 输出总金币数 return 0; }
代码执行流程
-
初始化阶段:
-
money=1:第一个阶段每天发1枚金币 -
t=1:第一阶段从第1天开始计数
-
-
每日处理:
-
第i天发放
money枚金币(sum += money) -
增加当前阶段天数计数(
t++) -
当
t > money时,表示当前阶段已结束:-
进入下一阶段(
money++) -
重置阶段计数器(
t=1)
-
-
-
终止条件:
-
当处理完k天后循环结束
-
输出累计的金币总数
sum
-
示例验证
样例1输入:6
-
第1天:money=1,sum=1,t=2
-
第2天:money=1,sum=2,t=3 → t>money → money=2,t=1
-
第3天:money=2,sum=4,t=2
-
第4天:money=2,sum=6,t=3 → t>money → money=3,t=1
-
第5天:money=3,sum=9,t=2
-
第6天:money=3,sum=12,t=3 → t>money → money=4,t=1
-
最终sum=14

浙公网安备 33010602011771号