链接: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;
}