D Cleaning 思維好題 字首)

2021-10-16 17:56:46 字數 877 閱讀 4149

題意:n個數,現在你可以取出相鄰的都不為0的數,使得他們同時減1,如果乙個堆為0了,它並不會消失掉,此時我們有至多一次機會操作,交換相鄰兩個數的位置,問能不能使得全部的數都變為0.

思路:首先發現,端點一定要<=後面的值,不然肯定不成立。

於是a2>=a1,減了之後a2=a2-a1;此時a2變成端點,同理可知a3>=此時的a2才能成立.

那麼對於從尾巴開始也是這個道理。

那麼中間的過程用乙個字首去記錄。也就是用字首表示前後相鄰能相減,那麼此時後面的這個數變成了多少。字尾同理。

如果中途碰到了pre[i-1]>a[i]的,那麼此時意味著如果將這兩個相鄰的減了,就將導致a[i-1]變成乙個「空島",不能滿足題目的要求。對於這種情況,記錄為pre[i]=inf/2;【為什麼/2,因為後端開始也有這個情況,在交換相鄰項的時候需要判前字尾是否相等。而如果suf=inf/2的話,本不能相等的兩個數變成了inf=inf——導致錯判]

然後列舉判斷前字尾pre[i]和suf[i+1]是否一樣。一樣就可以。不一樣嘗試交換,看可不可以。

#include#include#include#include#include#include#include#include#include#define debug(a) cout<<#a<<"="<>t;

while(t--)

else pre[i]=inf/2;

}for(ll i=n;i>=1;i--)

else suf[i]=inf;

}bool flag=1;

for(ll i=1;i<=n-1;i++)

else}}

}if(flag==0)

else cout<<"no"<}return 0;

}

字首單詞 好題

題目描述 一組單詞是安全的,當且僅當不存在乙個單詞是另乙個單詞的字首,這樣才能保證資料不容易被誤解。現在你手上有乙個單詞集合,你需要計算有多少個子集是安全的。注意空集永遠是安全的。輸入格式 第一行乙個數 表示集合的大小,以下n行。每行乙個由 構成的字串。輸出格式 安全子集的個數。樣例輸入 1 3he...

E Magic Stones (思維好題)

題意 給出a陣列,b陣列,下標為2 n 1 可以進行操作,a i a i 1 a i 1 a i 問進行若干次操作,能否將a陣列變成b陣列 思路 真是一道很巧妙的題目。對三個數字a i 1 a i a i 1,d1 a i a i 1 d2 a i 1 a i a i 可以這樣看,a i a i 1...

D Perfect Groups 思維好題

一道挺不錯的題目。定義乙個陣列的答案 將這個陣列分成k組,每組裡面任意一對數字乘積都是平方數,k要最小。題目給出乙個n個長度的大小,要你求每個子陣列的答案,最後輸出答案為1.2,3 n的子陣列各有多少個。n最大是5000,子陣列個數是n n 1 2,n平方也是沒問題的,因此我們只要考慮,如果o 1 ...