【题解】—— [NOIP2015 普及组] 金币
[NOIP2015 普及组] 金币
题目背景
NOIP2015 普及组 T1
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 n n n 天每天收到 n n n 枚金币后,骑士会在之后的连续 n + 1 n+1 n+1 天里,每天收到 n + 1 n+1 n+1 枚金币。
请计算在前 k k k 天里,骑士一共获得了多少金币。
输入格式
一个正整数 k k k,表示发放金币的天数。
输出格式
一个正整数,即骑士收到的金币数。
输入输出样例
输入 #1
6
输出 #1
14
输入 #2
1000
输出 #2
29820
提示
【样例 1 说明】
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1 + 2 + 2 + 3 + 3 + 3 = 14 1+2+2+3+3+3=14 1+2+2+3+3+3=14 枚金币。
对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 1 0 4 1\le k\le 10^4 1≤k≤104。
解法1.双重循环
1.1.题意解析
这是一道非常简单的循环练手题。适合新手
开双重循环。第一层循环这个周期获得的金币数,第二层循环每一天。用一个变量day
记录目前发金币的天数。记得随时都要判断day<k
。
1.2.AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k,i,j,coins=0,days=0;
cin>>k;
for(i=1;days<k;i++)//循环这个周期获得的金币数
for(j=1;j<=i&&days<k;j++)//循环每一天
coins+=i,days++;
cout<<coins;
return 0;
}
解法2.一层循环
2.1.题意解析
当然,这道题我们也可以只用一层循环来解决。具体代码如下:
2.2.AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k,sum=0,day=0,i=1;//用day储存目前取了多少天
cin>>k;
for(int i=1;day<k;day+=i,i++)
sum+=min(k-day,i)*i;//取接下来加的天数与剩下天数的较小值
cout<<sum;
return 0;
}
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育