心急的C小加
時間限制:1000 ms | 記憶體限制:65535 KB
難度:4
- 描述
-
C小加有一些木棒,它們的長度和質量都已經知道,需要一個機器處理這些木棒,機器開啟的時候需要耗費一個單位的時間,如果第i+1個木棒的重量和長度都大於等於第i個處理的木棒,那麼將不會耗費時間,否則需要消耗一個單位的時間。因為急著去約會,C小加想在最短的時間內把木棒處理完,你能告訴他應該怎樣做嗎?
- 輸入
- 第一行是一個整數T(1<T<1500),表示輸入資料一共有T組。
每組測試資料的第一行是一個整數N(1<=N<=5000),表示有N個木棒。接下來的一行分別輸入N個木棒的L,W(0 < L ,W <= 10000),用一個空格隔開,分別表示木棒的長度和質量。 - 輸出
- 處理這些木棒的最短時間。
- 樣例輸入
-
3 5 4 9 5 2 2 1 3 5 1 4 3 2 2 1 1 2 2 3 1 3 2 2 3 1
- 樣例輸出
-
2 1 3
貪心問題+最長遞增子序列問題
將輸入的資料按照長度進行排序,然後根據重量選擇遞增的最長子序列,不同的子序列之間耗費一個單位的時間#include <iostream> #include <vector> #include <algorithm> #include <utility> using namespace std; struct Stick{ int l,w; Stick(int ll = 0 , int ww = 0):l(ll), w(ww){} bool operator<(const Stick& a) const{ if(l!=a.l) return l < a.l; else return w < a.w; } }; int main(){ int T; cin >> T; for(int icase = 0; icase < T; icase++){ int n; cin >> n; vector<Stick> stick(n); for(int i = 0 ; i < n; ++ i) cin >> stick[i].l >> stick[i].w; sort(stick.begin(),stick.end()); int cnt = 0; for(int i = 0 ; i < n; ++ i){ if(stick[i].w){ cnt++; int minWeight = stick[i].w; stick[i].w = 0; for(int j = i+1; j < n; ++ j){ if(stick[j].w >= minWeight){ minWeight =stick[j].w; stick[j].w = 0; } } } } cout<<cnt<<endl; } }