課堂分組賽、組隊賽小結(jié)
分組賽
水題來的,n最大也就3000而已,往冒泡模板里加個計數(shù)秒赤()
最簡單也最好理解的辦法就是找到所有的子矩形,然后再用二維前綴和求值并與k比較就行了
不難,數(shù)據(jù)很弱,直接枚舉但要仔細(xì)讀題......
(不然就像某人沒看輸入要求慘遭零分)
/*for(int i=1;i<=n;i++) //錯誤的讀入
for(int j=1;j<=m;j++)
cin>>a[i][j];*/
for(int i=0;i<n;i++) //正確的讀入
{
cin>>A;
for(int j=1;j<=m;j++)
{
if(A[j-1]=='0')
a[i+1][j]=0;
else
a[i+1][j]=1;
}
}
這個題數(shù)據(jù)巨水,暴力19代碼行直接滿分(雖然沒AC但那幾個點(diǎn)不計分,優(yōu)化一下就能滿了)
后來聽評講,的那個思路簡單點(diǎn)來說就是從最高位到最低位逐位確定答案的每一位是0還是1,并實(shí)時把候選區(qū)間縮小到“可能產(chǎn)生最優(yōu)解”的那一段數(shù)字上,直到只剩兩個數(shù),直接取它們的與即可(參考文獻(xiàn):傳送門)
T4 P10724 [GESP202406 七級] 區(qū)間乘積
不算難,先二分答案出x,用貪心能否≤k 段,可行就再小一點(diǎn),不可行就再大一點(diǎn),直到鎖定最符合條件的x
大概的流程呢就是:
1.直接二分“每段和的最大值”這個答案 x,范圍是 max(a[i])≤x≤sum(a[i])
2.從左往右貪心掃一遍:
把數(shù)字依次累加,當(dāng)前段和一旦>x 就立即切一刀,段數(shù)加1。
如果掃完整個序列所用段數(shù)≤k,說明x可行,反之則不可行。
3.當(dāng)二分推進(jìn)到可行的答案時:收緊右端,嘗試更小的x
當(dāng)二分推進(jìn)到不可行的答案時:收緊左端,增大x
4.當(dāng)左右端點(diǎn)重合時,答案就出來了
T5 P13013 [GESP202506 五級] 獎品兌換
這玩意我自己都沒搞懂,就不亂寫東西誤導(dǎo)別人了()
組隊賽
因?yàn)槭墙M隊進(jìn)行的嘛,我們組的策略是各自為營,一人負(fù)責(zé)一部分題,所以這我就講講我敲的那幾個
捆綁銷售的奸商
很容易就能想到背包,仔細(xì)想想,好像只需要把那些捆綁銷售互相配對的云的價值與價格(“重量”)合并到一起,接著對新數(shù)據(jù)們跑一輪01背包就可以了
所以問題就變成了怎么把這堆云合并到一起去
眾所周知并查集是個好用的東西()
所以思路就很明顯了,用并查集合并數(shù)據(jù),然后對新數(shù)據(jù)跑一輪01背包,解決
其實(shí)這題我之前做過()
也挺水的,有一個條件是“所有的 q i互不相同”,所以就連c和q都不用讀進(jìn)來()
他就是有倆很大的坑點(diǎn),一是要是不開unsigned long long的話數(shù)據(jù)會超,第二呢是這題有個測試點(diǎn)要讀入的n是0......為什么動物園里的動物數(shù)量會是 0 ???題目第一句不是說 動物園里飼養(yǎng)了很多動物 嗎???
那個測試點(diǎn)的輸出是18446744073709551616相當(dāng)于是ull越界之后的值減一(我也不知道為什么要減一),(unsigned long long)-1)就能得到18446744073709551617了,而且這個點(diǎn)只占5分()
先用|計算出所有已有的動物編號中,哪些動物至少存在一次,然后再計算出手冊要求購買的飼料位數(shù)是那些,用手冊的位減去動物的位,那就s剩下來t個位可能為1,故而那總動物數(shù)就能達(dá)到2的t次方,減去已經(jīng)有的n個動物,所以答案就是

浙公網(wǎng)安備 33010602011771號