金币

GitHub跳转原题关系图返回列表

按每天工资等于连续发放天数的分段规则,逐段累加金币。

OJ: noi_openjudge

题目 ID: ch0105-45

难度:入门

标签:模拟循环数学python

日期: 2026-07-30 23:01

题意

ii 个发薪阶段持续 ii 天,每天发 ii 枚金币。求前给定天数内收到的金币总数。

思路

变量 salary 同时表示本阶段每天的金币数和本阶段长度。当前剩余天数可能不足一个完整阶段,因此本阶段实际发放天数为 min(days, salary)

加入 salary * paid_days 后扣除已处理天数,并进入下一阶段。

代码

Python代码

python
days = int(input())
total = 0
salary = 1

while days > 0:
    paid_days = min(days, salary)
    total += salary * paid_days
    days -= paid_days
    salary += 1

print(total)

C++代码

cpp
/* 
 *
 *  1
 *  2 3
 *  4 5 6
 *  7 8 9 10
 *  11 12 13 14 15
 * */
#include <cstdio>

int main(){
    int sum = 0;
    int n;
    scanf("%d",&n);
    int i,j,idx=0;
    for (i=1;1;i++){
       for(j=1;j<=i;j++){
           sum += i;
           idx++;
           if( idx == n){
               printf("%d\n",sum);
               return 0;
           }
       }
    }
    return 0;
}

复杂度

处理到第 kk 个阶段时已覆盖约 k2/2k^2/2 天,故时间复杂度为 O(n)O(\sqrt n),额外空间复杂度为 O(1)O(1)

总结

按规则天然分段的模拟题,直接处理整段比逐天累加更容易表达边界。