题目信息
题名:金币
题目:国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 n 天每天收到 n 枚金币后,骑士会在之后的连续 n+1 天里,每天收到 n+1 枚金币。
请计算在前 k 天里,骑士一共获得了多少金币。
输入格式:一个正整数 k,表示发放金币的天数。
输出格式:一个正整数,即骑士收到的金币数。
输入样例1:6
输出样例1:14
输入样例2:1000
输出样例2:29820
说明提示:骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。对于 100% 的数据,1≤k≤10^4。
NOIP2015 普及组 T1
分析题目
啊!连做4到NOIP普及组(现称CSP-J)的题了!洛谷有完没完啊!
这道题整体有点难度,但是代码很短,看到代码后就能发现这道题挺简单的。在说思路之前先献上三段代码:
day -= i;
money += mmoney * mmoney;
mmoney++;
这三段代码就是本题的核心,搭配上最后的money + day * mmoney都可以挑战最短代码了。
直接说思路吧:
- 声明day,money和mmoney。money初始化为0。mmoney初始化为1
- 输入天数
- 遍历1~day天
- 使用上面的核心代码
- 最后输出money即可
输出money那里直接使用 money + day * mmoney 输出即可。
示例代码
注释版:
#include <bits/stdc++.h> //万能头,应该不用多说
using namespace std;
int main()
{
int day, money = 0, mmoney = 1; // day为天数;money为金币(金币的英文不知道);mmoney的英文是many money,意思是多出来的钱,缩写成mmoney,初始化为1
cin >> day; //输入>>天数
for (int i = 1; i <= day; i++)
{ //循环天数
day -= i; //天数=天数-i
money += mmoney * mmoney; //钱=钱+多出的钱*多出的钱
mmoney++; //多出的钱累加
}
cout << money + day * mmoney << endl; //输出钱+天数*多出的钱并且回车
system("pause");
return 0; //返回值 0(结束)
} //中文计算机语言有没有?
复制版:
#include<bits/stdc++.h>
using namespace std;
int main(){
int day, money=0,mmoney=1;
cin >> day;
for (int i = 1; i <= day; i++){
day -= i;
money += mmoney * mmoney;
mmoney++;
}
cout << money + day * mmoney << endl;
system("pause");
return 0;
}