題目:
題意:將乙個陣列分為m份,其中最大個數的那乙份元素之和t要最小。
官方題解:如果不考慮每份可以任意減去乙個元素,就是乙個經典的二分問題,具有單調最優的性質:如果最大值為 t可以滿足條件劃分,那麼最大值為t+1也可以。所以就直接二分最大值t,找到最小滿足條件的t即可。本題加了乙個條件:每份可以刪除任意乙個陣列。為了能夠讓最大值最小,顯然每份中刪去的一定是最大元素,所以在二分判定可行性時,維護當前序列的最大值,然後記錄刪除最大值的結果,也就是說二分的判定是:是否可以讓每組刪除最大值之後,總和都小於等於t。
理解:
感覺官方的題解看得不是很懂,但二分思想確實是沒想到的。其實剛開始對題目的理解有點偏,將問題看成了:求最大解題數且最小使用時間,成了兩個目標的問題,感覺實在想不通。但看了官方的解題步驟後,發現其實最大的解題數是不用求解的,我們只要保證在最大的解題數的那天花費的時間最少就行。那麼只需要求解t的取值。
可以理解t為在m天中任何一天求解題目最多花費的時間。那麼,我們的目標就是,確定乙個t值,使該陣列中元素之和小於t,且使用天數不大於m。這個t有很多解,要取最小的那乙個。
題目中還說了,可以請求一次外援。這點在題解中解釋得較清楚,只需要去掉當天解題數目中耗時最多的那題。
classsolution else
}return
right;
}/*判斷一天最多時間limit是否能夠讓小張在m天內完成
當 useday=m 時,說明limit太小了,不足以在m天完成所有題目(注:useday從0開始算)
*/private
boolean check(int limit, int time, int
m)else
}return useday < m; //
看看是不是在規定的時間內完成
}
public
static
void
main(string...arg);
int m = 2;
//int time = ;
//int m = 4;
//int time = ;
//int m = 2;
solution solution = new
solution();
system.out.println(solution.mintime(time, m));
}}
LCP 12 小張刷題計畫(二分查詢)
1.問題描述 為了提高自己的 能力,小張制定了 leetcode 刷題計畫,他選中了 leetcode 題庫中的 n 道題,編號從 0 到 n 1,並計畫在 m 天內按照題目編號順序刷完所有的題目 注意,小張不能用多天完成同一題 在小張刷題計畫中,小張需要用 time i 的時間完成編號 i 的題目...
LCP 12 小張刷題計畫 二分法的擴充套件
提高自己的 能力,小張制定了 leetcode 刷題計畫,他選中了 leetcode 題庫中的 n 道題,編號從 0 到 n 1,並計畫在 m 天內按照題目編號順序刷完所有的題目 注意,小張不能用多天完成同一題 在小張刷題計畫中,小張需要用 time i 的時間完成編號 i 的題目。此外,小張還可以...
字尾陣列模板 LCP小證明
複習了一遍字尾陣列 關於lcp的證明 簡單的說下 設p min height k ilcp i,j p,顯然lcp i,j p 排名越相近,字首越可能相同 假設lcp i,j tp。則字串sa i 和字串sa j 前tp位相同。從sa i 到sa j 之間的字串一定是從sa i 到sa j 字典序遞...