【题目链接】
ybt 1100:金币
ybt 1969:【15NOIP普及组】金币
OpenJudge NOI 1.5 45:金币
洛谷 P2669 [NOIP2015 普及组] 金币
【题目考点】
1. 循环
【解题思路】
国王发金币
在第1阶段,持续1天,每天给1个金币
在第2阶段,持续2天,每天给2个金币
…
在第d阶段,持续d天,每天给d个金币
- 设变量d表示国王发金币的阶段,设j表示现在是在当前阶段中的第几天
- i从1循环到n,表示天数,每天获得d个金币,j增加,并尝试更新阶段数d。
- 或每次循环,发放一个阶段的金币。
【题解代码】
解法1:每过一天,尝试更新当前阶段
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int sum = 0, d = 1, j = 1;//d:当前在第几阶段, j:在这一阶段第几天 sum:获得的总金币数
for(int i = 1; i <= n; ++i)//i:从开始算起到了第几天
{
sum += d;//当前处于阶段d,第i天获得d个金币
if(j >= d)//若在当前阶段已经过了d天
{
d++;//阶段数增加1
j = 1;//下一天是新的阶段的第一天
}
else
j++;//处于本阶段的天数增加
}
cout<<sum;
return 0;
}
解法2:每次发放一个阶段的金币
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, sum = 0, d = 0, i = 1;//sum:获得的总金币 d:阶段数 i:天数
cin>>n;
while(i <= n)//每次while循环,发放一个阶段的金币
{
d++;
for(int j = 1; j <= d; j++)
{
sum += d;
i++;
if (i > n)
break;
}
}
cout<<sum;
return 0;
}