P1233 木棍加工 題解

2022-01-12 07:20:15 字數 1406 閱讀 5915

題目傳送門。

1.題外話

dp掌握不夠好,最近在題單裡從dp入門開始刷~

2.解題意

木棍套娃,如果不能套了就要進行1分鐘準備。所以說是每一段最長不上公升子串行對應一分鐘,求的總準備時間就是最長不上公升子串行的個數。

3.找思路

首先看到這種題面,我們不難根據以往經驗想到排序。要滿足木棍的長度乙個比乙個小,我們可以先拿長度l由大到小排序,這樣所有的l都滿足了形成套娃的條件。於是我們只用對寬度w討論即可,l就可以不用管了。

對於寬度w,考慮套娃的條件,不難得知只有當w[i-1]>w[i]時才能套娃,也就是讓我們求最長不上公升子串行。答案是準備時間,前面我們已經講了準備時間就是最長不上公升子串行個數。於是答案讓我們求的就是關於w的最長不上公升子串行個數。

根據dilworth定理可知,最長不上公升子串行個數=最長上公升子串行長度。

dilworth下方有我推薦的講解鏈結,如果不會dilworth,也可以這樣簡單理解:從每乙個最長不上公升子串行中抽乙個元素,就組成最長上公升子串行了。那麼最長上公升子串行長度就是最長不上公升子串行的個數。當然這是一種想當然的理解。要找的話肯定還需要更細的方案才行。

於是我們用nlogn演算法求出w的最長上公升子串行長度並輸出即可。

總體步驟:

1.建立結構體,cmp比較函式,讀入資料

2.sort按照cmp排序

3.nlogn求最長上公升子串行長度

就是這麼簡單。

關於dilworth定理,我從網上隨機找了一名dalao的部落格,讀了讀,比較簡單易懂。

4.code

1 #include2 #include3 #include4 #include5

#define ll long long

6#define re register

7#define n 5010

8using

namespace

std;

9 inline int

read()

1013

while(ch>='

0'&&ch<='9')

14return x*f;15}

16int

n,f[n],ans;

17struct

sticks[n];

20bool

cmp(stick a,stick b)

2124

intmain()

2543 f[l]=s[i].w;44}

45}46 printf("%d"

,ans);

47return0;

48 }

view code

完結撒花。

P1233 木棍加工

一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...

P1233 木棍加工

miku 很簡單的線性dp 或者說不用dp 有兩維,隨便按照一維降序排個序,就成了個固定順序的一維問題了。直接 o n 2 貪心劃分不下降子串行或者說運用dilworth定理,求最長上公升子串行 貪心更快誒,可能是因為continue的多?dp include include include inc...

P1233 木棍加工

我是想寫寫dp來著 所以我查了標籤是dp的題。在做了三道藍題之後,蒟蒻的我想做一道簡單點的題恢復自信qwq 於是,這道題,我怎麼也下過不出轉移方程 但是我忽然發現,這道題根本就不用dp!貪心 排序即可!因為我們一定是要時間 n 的,所以我們就算最後什麼也沒找到,也不會比 n 更差,那麼我們先按照其中...