国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去。当连续 n天每天收到 n 枚金币后,骑士会在之后的连续 n+1 天里,每天收到 n+1 枚金币(n 为正整数)。
请编程确定从第一天开始的给定天数内,骑士一共获得了多少金币。
【输入格式】
输入包含至少一行,但不多于 1000 行。
除最后一行外,输入的每行是一组输入数据,包含一个正整数 n,表示天数。
输入的最后一行为 0,表示输入结束。
【输出格式】
对每个数据输出一行一个整数,表示该数据对应总金币数。
Samples
输入数据 1
10
6
7
11
15
16
100
10000
1000
21
22
0
Copy
输出数据 1
30
14
18
35
55
61
945
942820
29820
91
98
Copy
【数据规模】
对于 60% 的数据满足:n≤10^3 ;
对于 80% 的数据满足:n≤10^6 ;
对于 100% 的数据满足:n≤10^12 。
个人还是接受不了太长的题目,但是经过分析后还是较为简单的。就是先定义一个储存答案的未知数ans,然后就是第1天每天给一个金币,共1^1个金币,接下来两天每天两个,共2^2个…………。不难发现,每次增加i^2个金币,天数加i,直到天数溢出为止,最后在把多的减掉就可以。
代码如下
#include<bits/stdc++.h>
using namespace std;
int ans,day; //用于储存答案、天数
int pas;//已经过去的天数
int ii;
void chs()//初始化
{
ans=0;
pas=0;
return;
}
int main()
{
while(cin>>day)
{
if(day==0)
break; //结束
chs();
for(int i=1; pas+i<=day; i++)
{
ans+=i*i;
pas+=i;
ii=i;
}
ii++;
ans+=ii*ii;
ans=ans-(pas+ii-day)*ii;
cout<<ans<<endl;
}
return 0;
}
最后只得了80分,数据规模一大就超时了。
ps:本人第一次写博客,写代码也是菜鸡,讲解写的也很模糊,已经尽力了 ε=(´ο`*)))唉
标签:ii,pas,int,天数,c++,金币,ans From: https://www.cnblogs.com/Zelda-anjisuan/p/16961739.html