1. 程式人生 > 實用技巧 >2017, X Samara Regional Intercollegiate Programming Contest M. Last Man Standing (貪心,雙指標)

2017, X Samara Regional Intercollegiate Programming Contest M. Last Man Standing (貪心,雙指標)

  • 題意:有\(n\)個吃雞玩家,在某個時間段給你他們每個人的殺敵數,判斷資料是否合法,並輸出每個人對應的殺敵情況.

  • 題解:剛開始寫的是直接暴力列舉,向後去找並且標記,然後存到vector最後輸出,結果一直MLE,後來發現可以用雙指標來搞.首先只要總殺敵數不大於\(n-1\),那麼就永遠都是合法的,然後不難發現,因為是降序排列,那麼後面的人都可以是前面人的炮灰,所以我們用左指標反著找到第一個不為\(0\)的數,每次對左指標所在的數\(-1\),那麼右指標就要向左移一個(因為它被左指標幹掉了),若左指標所在的數變為\(0\)了,就要向左移一個(已經滿足殺敵數了),每次都輸出一下就好了.

  • 程式碼

    :

    int n;
    int a[N];
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);
        scanf("%d",&n);
        ll sum=0;
        for(int i=1;i<=n;++i){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
     
        if(sum>n-1){
            puts("NO");
        }
        else{
            puts("YES");
            int l=n;
            int r=n;
            while(a[l]==0) l--;
            while(l>=1){
                printf("%d %d\n",l,r);
                r--;
                a[l]--;
                if(a[l]==0) l--;
            }
        }
     
        return 0;
    }