洛谷P1233 木棍加工

2022-02-16 15:49:43 字數 1704 閱讀 6192

一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的:

第一根棍子的準備時間為1分鐘;

如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l>=li,w>=wi,這個棍子就不需要準備時間,否則需要1分鐘的準備時間;

計算處理完n根棍子所需要的最短準備時間。比如,你有5根棍子,長度和寬度分別為(4, 9),(5, 2),(2, 1),(3, 5),(1, 4),最短準備時間為2(按(4, 9)、(3, 5)、(1, 4)、(5, 2)、(2, 1)的次序進行加工)。

第一行是乙個整數n(n<=5000),第2行是2n個整數,分別是l1,w1,l2,w2,…,ln,wn。l和w的值均不超過10000,相鄰兩數之間用空格分開。

僅一行,乙個整數,所需要的最短準備時間。

輸入:54

9522

1351

4輸出:

2

洛谷題解系列好久沒更新了,今天寫乙個,當然這也是我的附屬部落格中的第一篇題解!

注:附屬部落格點選側邊欄的手機端按鈕即可。

下面正式進入題解部分

先看一下這個題目的標籤:貪心,動態規劃

(誒嘿嘿,我最喜歡貪心了)

這個題目有兩個屬性,長和寬,並且這兩個屬性都是不上公升序列。

我們可以先開乙個結構體儲存長和寬(方便排序)

首次固定乙個屬性,我這裡固定了長,

為什麼要這麼做呢?

你想想哈,一根木棒的長大於另一根木棒,這樣怎麼也是要花錢的,所以,為了保證花最少的錢,就先要把乙個屬性排序。

排序好了,那麼寬怎麼辦嘞?

看題目,逐步求最長不下降子串行即可。

根據dilworth定理可得。

最長不下降子串行的個數等於最長上公升子串行的長度

最長上公升子串行的長度用動態規劃很好解(下週我會發布關於動態規劃演算法的問題解決方法)

好了,問題解決

struct

ffa[

5002

];int

cmp(ff x,ff y)

sort(a+1,a+n+1,cmp);

for(int i=1;i<=n;i++)

1 #include2 #include3 #include4 #include5 #include6

#define inf 100000000

7using

namespace

std;

8structff9

a[5002

];12

intcmp(ff x,ff y)

1316

int dp[5002

];17

intmain()

1825 sort(a+1,a+n+1

,cmp);

26for(int i=1;i<=n;i++)

2733

int ans=0;34

for(int i=1;i<=n;i++)

35 ans=max(ans,dp[i]);

36 cout<37return0;

38 }

好了,就到這裡了。

客官,給個贊再走唄?

洛谷 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,這個棍子就不需要...