题解 | #[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")
