1. 程式人生 > >NOIP2015普及組 T1金幣

NOIP2015普及組 T1金幣

http 代碼 sin https class new 復雜 衡量 TP

我對模擬的理解:http://www.cnblogs.com/AKMer/p/9064018.html

題目鏈接:https://www.luogu.org/problemnew/show/P2669

這是我\(OI\)生涯中第一場比賽的第一道題目,而且這題在\(2015\)的普及組之前我就做過了(當時教練說\(NOIP\)會從\(NOI\)題庫裏選原題於是我就狂刷了一通\(emmm\))。只需根據它的題意模擬按階段發金幣,然後特判最後一個階段是否會全部發完就可以了,水的不能再水。

時間復雜度(最壞情況):\(O\)(141) \[\sum_{i=1}^{140} i<1e4<\sum_{i=1}^{141}i\]

空間復雜度:\(O\)(1)

代碼如下:

#include <cstdio>
#include <algorithm>
using namespace std;

int n,sum;

int read() {
    int x=0,f=1;char ch=getchar();
    for(;ch<‘0‘||ch>‘9‘;ch=getchar())if(ch==‘-‘)f=-1;
    for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar())x=(x<<1)+(x<<3)+ch-‘0‘;
    return
x*f; }//快讀。雖然這已經暴露了我省選選手的身份,但是我還是要寫這篇博客>_< int main() { n=read(); int k=1;//n為天數,k為階段,第k階段持續k天,每天發k枚金幣。 while(n) {//當還有發金幣的天數還有剩余 if(n>=k) { sum+=k*k; n-=k;//第k階段會完全過完 } else { sum+=n*k; n=0;//第k階段只過了一部分,n天就過完了。為了退出循環,特地把n扣成0,雖然按照現實生活天數也只能用自然數來衡量……
} k++;//進入下一階段 } printf("%d\n",sum); return 0; }

NOIP2015普及組 T1金幣