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