【貪心】積木大賽

原題傳送門spa

思路


這篇文章這篇題目據說是NOIP2018Day1第一題,但在此以前某谷上就有此題,而NOIP2018提升組於是被批爲原題大賽QAQ。code

這道題說一道典型的貪心題,貪心策略就是當把所要求目標較高的積木搭好的時候他旁邊的所求目標較小的就會被順便搭好,所以不記錄數目。get

因此個人第一個版本的代碼就是從第一個開始向後搜索一直到搭好的一個停下,期間的全部房子層數都加1,總次數+1,而後再從第二個開始,以此類推……此方法的時間複雜度爲O(n2),顯然——沒法AC,實際狀況是此代碼得了90分,倒也不算低,但我通過左思右想(偷翻題解),終於作出了O(n)的作法:若a[n] 大於 a[n+1] 那麼所須要的次數就是a[n]-a[n-1],將a[0]設爲0,從a[1]開始,一直到a[n],累計次數,求出總次數便可,爲何這樣貪心是對的呢?那是由於,在考慮a[x]時,雖然只考慮了a[x-1],但a[x-1]以前的都已經處理過了——咱們是順次處理的,其實語言沒法很好的解釋清楚,假若你們還沒明白,那就自悟吧QAQ。io

90分Code


#include<cstdio>

using namespace std;

int main()
{
    freopen("in.txt","r",stdin);
    //讀入
    int ans=0,n;
    int h[100001];
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&h[i]); 
    
    //裝叉走起
    for(int i=1;i<=n;i++)
    {
        while(h[i]!=0)
        {
            for(int j=i;j<=n;j++)
            if(h[j]==0)break;
            else h[j]--;
            ans++;
        }
    }
    
    //輸出
    printf("%d",ans);
    return 0;
}

AC-Code


#include<cstdio>
using namespace std;
int s,n,ans,now;
int main()
{
    int i;
    scanf("%d",&n);
    scanf("%d",&ans);
    now=ans;//記錄當前目標積木高度
    for(i=1;i<n;i++)
    {
        scanf("%d",&s);
        if(s>now) ans+=(s-now);
        now=s;//更新如今目標的值
    }
    printf("%d",ans);
    return 0; 
}
相關文章
相關標籤/搜索