演算法:排序,dp(最長上公升子串行)
前言:
此題的資料非常水,這裡給予一組 hack 資料:
21962519
3919
8751761
1114674511
1615184
5176
4933
1357
7386
4199981
4151
1361
1733
8162
4741
請求加強資料!
正文
我看題解裡好多人寫的都是貪心,唯一乙個贊比較多的 dp 解法還被我的資料 hack 了,於是就寫了這篇題解(其實我第一次提交的**也會被 hack)。
這道題首先要用結構體排序,以木棍的長度為第一關鍵字(從大到小),以寬度為第二關鍵字排序(同樣也是從大到小)。
需要注意的是,如果在兩根木棍長度相等的情況下,必須要按寬度排序,否則就會被 hack。
在排序後,我們直接可以扔到這個長度不管了,直接把寬度跑一遍最長不上公升子串行,得出最長不上公升子串行的個數。但是我們知道,最長不上公升子串行的個數等於最長上公升子串行的長度,所以我們只需要求出後者即可。
$ \rm code $
# include usingnamespace
std;
# define maxn
50005
struct
stick stick[maxn];
//首先定義乙個名字為 stick 的結構體,存放木棍的長度和寬度.
intn, dp[maxn];
//然後定義木棍的數量 n 和 dp 陣列.
bool
cmp(stick, stick);
//這是排序函式.
intmain()
bool
cmp(stick a, stick b)
洛谷 P1233 木棍加工
一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...
洛谷 P1233 木棍加工
題目鏈結 p1233 木棍加工 解題思路 其實就是求最長上公升子串行 參見diworth定理,序列的不下降子串行最少劃分數等於上公升序列的總長度 以測試資料為例 輸入 5 1018186 1019 1913 208輸出 3可以理解為最後加工的組數為3組,取其中一種情況,比如 10,19 10,18 ...
洛谷P1233 木棍加工
一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...