做错了那么多次后,总算发现错在哪里的心情,是抓狂的

P2669 [NOIP2015 普及组] 金币

洛谷1号管理员 @ 2017-08-04 22:06:13

很简单

#include<iostream>
using namespace std;
//k=3天 从i=1开始发一个金币 s=1,剩下k=k-i=2
//剩下k=2,连续2天发两个金币 s=s+i*i=1+(2*2)=5个
//k=4一共有4天,前三天按照上面的分发:s=5;k=1;i=3个金币;
//s=s+k*i=5+1天*3个 
//核心思想:k>=i时,够发 s=s+i*i;k=k-i;i++;
//k<i时,不够发 s=s+k*i;k=0;天数直接发完
//k是天数  i发金币的个数 
int s,k;
void read()
{
int i,j;
cin>>k;
s=0;
i=1;//发一个金币 
while (k!=0)//k天从第一天开始发,最后剩下0天
{
if(k>=i)//够发:连续i天发i个金币
{
s=s+i*i;
k=k-i;//天数减少,发了i天
i++;//下一个周期发i+1金币 
}//if k 
else
{
s=s+k*i;//不够发,发i个金币只有k天
k=0;//k天直接发完 
}
}//end while
cout<<s<<endl;
}
int main()
{
read();
return 0;
}

|