题解 | #[NOIP2015]金币#

[NOIP2015]金币

https://www.nowcoder.com/practice/8f71f5670e6a45118d24d13868a2da9e

#include <iostream>
using namespace std;
//此方法是计算n天时,骑士当天一天能够获得金币数计算的
//通过计算当天一天获得金币数可以确定两个信息 1,增加工资的次数 2,在该工资的情况下,骑士工作了多少天
int main() {
    int n, income = 0,coin = 1;
    scanf("%d", &n);
    int rest = 0,whole = 0; //whole 表示在不超过n天的情况下,增加工资的次数; rest表示在当前工资情况下工作									的天数
    for(int i = 1; i < n; i++)//计算最大的工资增加次数
    {
        if(i*(i+1) <=2*n && (i+1)*(i+2) > 2*n)
        {
            whole = i; break;
        }   
    }
    rest = n - (whole + 1)*whole /2;//计算最大的工资时,骑士的工作天数
    for(int i = 1; i <= whole;i++)//以工资增加次数为终止条件
    {
        for(int j = 0; j < i;j++)	//每增加一次工资,该工资条件下的工作天数就等于该工资给的金币数
        {
            income += coin;		//每次增加一天,收入按当前工资增加
        }
        coin++;					//每经历一个工资增加周期,工资加一
    }
    income += rest*coin;		//将不足一个循环周期的工资加入总收入中
    cout << income ;
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务