2017, X Samara Regional Intercollegiate Programming Contest M. Last Man Standing (貪心,雙指標)
阿新 • • 發佈:2020-08-14
-
題意:有\(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; }