洛谷11 20我想AC隊訓練計畫之貪心篇

2022-06-01 01:57:11 字數 2160 閱讀 3739

一堆木頭棍子共有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,相鄰兩數之間用空格分開。

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

輸入 #1複製

5

4 9 5 2 2 1 3 5 1 4

輸出 #1複製

2
這個題有很多種方法,在洛谷的題解裡有貪心,動歸。這個題還涉及到了乙個知識最長上公升子串行和最長不下降子串行.

有乙個規律:同乙個序列的最長公升序子串行的最小劃分==這個序列的最長降序子串行的包含元素的個數。

法一:貪心

用乙個book陣列記錄已經被查詢過的結點,使用雙重迴圈,第一層迴圈是遍歷整個排好序的木棍,因為長度l一定是從大到小的,所以只需要比較寬度w。比較每乙個a[i].w=cut,以其為標準找到以它為首的下降序列,那麼cut所代表的a[i]對應的book陣列

book[j]一定等於0.那麼我們就可以在最後遍歷一遍book陣列找到等於0有多少個就是所花費的時間。

實質上這種貪心的方法就是求同一序列的最長降序子串行最小劃分的個數

1 #include2 #include3 #include4 #include5

#pragma warning(disable:4996)

6using

namespace

std;

7struct

stick ;

11 stick a[5005

];12

int book[5005

];13

bool

cmp(stick a, stick b)

1418

intmain()35}

36}37}

38int time = 0;39

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

43 printf("

%d\n

", time);

44 system("

pause");

45return0;

46 }

法二:動歸?

首先也是排序,按照上一種的規則進行排序不過這裡的cmp函式沒有考慮l相等的情況。for迴圈遍歷每次找到比自己大的s[i].w加入到上公升陣列f[i]中,最後上公升陣列的元素個數就是時間。注意的是當找不到比最後乙個數大的木棍時,要在已有的f[i]陣列裡遍歷找到可以替代的那個值並交換,查詢過程用二分,注意二分的左右端點的取值。

1 #include2 #include3 #include4

#pragma warning(disable:4996)

5using

namespace

std;

6struct

stick7;

11 stick s[5005

];12

intn;

13int f[5005] = ;

14bool

cmp(stick a, stick b)

1518

intmain()

28else

38 f[l] =s[i].w;39}

40}41 printf("%d"

, ans);

42 system("

pause");

43return0;

44 }

洛谷1120小木棍

題目描述 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入輸出格式 輸入格式 輸入檔案共有二行。第一行為乙個單獨的整數n...

AC日記 小木棍 資料加強版 洛谷 P1120

喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過50。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入格式 輸入檔案共有二行。第一行為乙個單獨的整數n表示砍過以後的小木棍的總...

洛谷 1120 小木棍 資料加強版

題目描述 喬治有一些同樣長的小木棍,他把這些木棍隨意砍成幾段,直到每段的長都不超過5050。現在,他想把小木棍拼接成原來的樣子,但是卻忘記了自己開始時有多少根木棍和它們的長度。給出每段小木棍的長度,程式設計幫他找出原始木棍的最小可能長度。輸入輸出格式 輸入格式 共二行。第一行為乙個單獨的整數n表示砍...