洛谷p1233 sort 貪心

2021-09-27 06:35:00 字數 1265 閱讀 6726

題目描述

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

輸出格式

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

其實看資料n的範圍,n^2是可以接受的(瞎搞都可以!!!);

那麼其實每一根棍都想找乙個可以讓他不用準備時間的棍子作為上一根棍子。

我們對長和寬排序,寬的大在前,一樣大的長在前(反過來也可以)。我們就從上往下去列舉就可以了,因為我們已經使長的最大的在前面了,我們就只要從上往下找看看有什麼是符合條件的木棍,那根棍就可以直接拿(拿完後上一根的數值就要變為這一根了,也就是長寬的限制條件要改變)。列舉每一根木棍就直接可以有答案了。

#include#include#include#include#include#include#include#includeusing namespace std;

const int max_ = 1e7 + 7;

int n, head[max_], xiann = 1, ml,md;

inline int read()

while (ch >= '0'&&ch <= '9')

return s * f;

}struct k node[max_];

bool cmp(const k & t1, const k &t2)

return t1.chang > t2.chang;

}int main()

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

int ans = 0;

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

} }cout << ans;

return 0;

}

洛谷 P1233 貪心

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

貪心,LIS 洛谷P1233 木棍加工

給定一些木棍的長度和寬度,現要安排加工這些木棍的順序,使得總等待時間最少 這道題有點像球賽。首先,我們現滿足長度和寬度中的乙個,為什麼這個一定成立呢?因為長度接上與寬度加上對答案的貢獻都是1,那麼我們盡可能使其中一種先滿足,在求出最多能滿足另一種的方案,其實要滿足另一種的方案,能接上的長度即為最長上...

洛谷 P1233 木棍加工

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