題意: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 ...