洛谷 P1233 木棍加工 題解

2022-02-02 20:18:22 字數 1012 閱讀 5238

演算法:排序,dp(最長上公升子串行)

前言:

此題的資料非常水,這裡給予一組 hack 資料:

21

962519

3919

8751761

1114674511

1615184

5176

4933

1357

7386

4199981

4151

1361

1733

8162

4741

請求加強資料!

正文

我看題解裡好多人寫的都是貪心,唯一乙個贊比較多的 dp 解法還被我的資料 hack 了,於是就寫了這篇題解(其實我第一次提交的**也會被 hack)。

這道題首先要用結構體排序,以木棍的長度為第一關鍵字(從大到小),以寬度為第二關鍵字排序(同樣也是從大到小)。

需要注意的是,如果在兩根木棍長度相等的情況下,必須要按寬度排序,否則就會被 hack。

在排序後,我們直接可以扔到這個長度不管了,直接把寬度跑一遍最長不上公升子串行,得出最長不上公升子串行的個數。但是我們知道,最長不上公升子串行的個數等於最長上公升子串行的長度,所以我們只需要求出後者即可。

$ \rm code $

# include using

namespace

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