P2669 [NOIP 2015 普及组] 金币

解题思路

这道题目要求我们模拟骑士领取金币的过程,计算前k天总共获得的金币数。金币发放的规律是:

  • 第1天:1枚金币

  • 第2-3天:每天2枚金币(共2天)

  • 第4-6天:每天3枚金币(共3天)

  • 第7-10天:每天4枚金币(共4天)

  • 以此类推...

我们可以观察到:

  1. 每个发放阶段的天数等于该阶段每天发放的金币数(n天每天发n枚)

  2. 需要跟踪当前处于哪个发放阶段(money变量)

  3. 每个阶段内部用计数器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;
}

代码执行流程

  1. 初始化阶段

    • money=1:第一个阶段每天发1枚金币

    • t=1:第一阶段从第1天开始计数

  2. 每日处理

    • 第i天发放money枚金币(sum += money

    • 增加当前阶段天数计数(t++

    • t > money时,表示当前阶段已结束:

      • 进入下一阶段(money++

      • 重置阶段计数器(t=1

  3. 终止条件

    • 当处理完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

posted @ 2025-05-09 22:18  CRt0729  阅读(134)  评论(0)    收藏  举报