链接:https://ac.nowcoder.com/acm/problem/16490
来源:牛客网
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
输入描述:
输入只有1行,包含一个正整数K,表示发放金币的天数。
输出描述:
输出只有1行,包含一个正整数,即骑士收到的金币数。
示例1
输入
复制
6
输出
复制
14
备注:
对于100%的数据,1 ≤ K ≤ 10,000。
对于这个题而言,我首先想到的是数组前缀和,定义一个数组a存金币数(1,2,3...),定义一个数组c去存前缀和,在循环中去判断进行的c的第几项,记得最后的和由两部分组成,一个是前一整个部分的和,一个是下一部分一部分的和,比如输入7,sum1=1+2+2+3+3+3;sum2=4*(7-sum1);
上代码
#include <iostream>
using namespace std;
int main()
{
long long int n,m1=0,m2;
cin >> n;
long long int a[n+1],c[n+1];
for(int i=1;i<=n;i++)
{
a[i]=i;
}
if(n==1)
{
cout << 1 ;
}
else
{
c[1]=1;
for(int i=2;i<=n;i++)
{
c[i]=a[i]+c[i-1];
m1=(i-1)*(i-1)+m1;
if(c[i]>n&&c[i-1]<=n)
{
m2=i*(n-c[i-1]);
//cout << << endl;
break;
}
}
cout << m1+m2 << endl;
}
return 0;
}
京公网安备 11010502036488号