高二數學《綠色通道》總共有 \(n\) 道題目要抄,編號 \(1\ldots n\),抄第 \(i\) 題要花 \(a_i\) 分鐘。小 y 決定只用不超過 \(t\) 分鐘抄這個,因此必然有空著的題。每道題要麼不寫,要麼抄完,不能寫一半。下標連續的一些空題稱為乙個空題段,它的長度就是所包含的題目數。這樣應付自然會引起馬老師的憤怒,最長的空題段越長,馬老師越生氣。
現在,小 y 想知道他在這 \(t\) 分鐘內寫哪些題,才能夠盡量減輕馬老師的怒火。由於小 y 很聰明,你只要告訴他最長的空題段至少有多長就可以了,不需輸出方案。
由於最長長度和最短時間都不確定。我們可以假設其中一項確定來思考。
考慮二分答案,二分最長空題段。
假設二分當前最長空題段為 \(k\),我們就可以嘗試dp處理。
設 \(dp_i\) 表示第 \(i\) 題做,且前 \(i\) 題的最長空題段小於等於 \(k\) 時的最短時間,我們可以列舉上一條做了的題,即:
\[dp_i=\min_^dp_j+a_i
\]答案我們可以在 \([n-k-1, n]\) 裡列舉最後一道題的位置,時間複雜度 \(o(n^2\log n)\)。
顯然,\(\min_^dp_j\) 可以用單調佇列優化,時間複雜度 \(o(n\log n)\)。
這是一道二分+單調dp的模板。
題目問最長能多長,可以考慮二分,成為切入點。
當最長長度確定,dp也很容易可以寫出。
超時後也容易發現,式子中可以用單調佇列優化,**不難打。
// problem: 1603:綠色通道
// contest: ssoier
// url:
// memory limit: 524 mb
// time limit: 1000 ms
// // powered by cp editor (
#includeusing namespace std;
#define int long long
inline int read()while(ch>='0'&&ch<='9')return x*f;}
//#define mo
#define n 500010
//#define m
int n, m, i, j, k;
int l, r, mid, ans;
int dp[n], a[n], t;
pairp;
deque>q;
int check(int k)
ans=0x7fffffffffffffff;
for(i=n-k-1; i<=n; ++i) ans=min(ans, dp[i]);
return ans<=t;
}signed main()
printf("%lld", l);
return 0;
}
題解 一本通1224 最大子矩陣
花兩分鐘靜心看看,望您有所收穫 1224 最大子矩陣 時間限制 1000 ms 記憶體限制 65536 kb 提交數 3073 通過數 1958 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 11 1 子矩陣。比如,如下 4 4 的矩陣 0 2 7 0...
一本通題解 1251 仙島求藥
一本通 oj,計蒜客 oj,少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由m n個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應...
一本通 3 1 練習 4 Tree 題解
題目位址 第一眼看到此題,感覺就是一道水題,直接加上前nee dneed need 小的白邊就行了,再處理到n 1 n 1n 1條黑邊,但是,打完後突然發現有問題。雖然加上了前nee dneed need 小的白邊,但是會出現樹不連通的現象,即無法構成生成樹。正解思路 二分乙個增量mid midmi...