貪心入門題——木棍
阿新 • • 發佈:2019-02-14
問題 C: 木棒
時間限制: 1 Sec 記憶體限制: 32 MB提交: 10 解決: 6
[提交][狀態][討論版]
題目描述
現有n根木棒,已知它們的長度和重量。要用一部木工機一根一根地加工這些木棒。該機器在加工過程中需要一定的準備時間,是用於清洗機器,調整工具和模板的。木工機需要的準備時間如下:(1)第一根木棒需要1min的準備時間;
(2)在加工了一根長為l,重為w的木棒之後,接著加工一根長為ll(l<=ll),重為ww(w<=ww)的木棒是不需要任何準備時間的。否則需要一分鐘的準備時間。
給定n根木棒,你要找到最少的準備時間。例如現在有長和重分別為(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那麼所需準備時間最少為2min,順序為(1,4),(3,5),(4,9),(2,1),(5,2)。
輸入
每個測試例兩行:
第一行是一個整數n(1<=n<=5000),表示有多少根木棒;
第二行包括n*2個整數,表示了l1,w1,l2,w2,l3,w3,...,ln,wn,這些數均不大於10000,其中li和wi表示第i根木棒的長度和重量。
輸出
輸出以分鐘為單位的最少準備時間。樣例輸入
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 <bits/stdc++.h> using namespace std; const int SIZE=5005; struct node { int wei; int l; }; node a[SIZE]; bool cmp(node a,node b) { if(a.l!=b.l) { return a.l<b.l; } else { return a.wei<b.wei; } } int main() { int t; cin>>t; int n; while(t--) { cin>>n; for(int i=0; i<n; i++) { scanf("%d%d",&a[i].l,&a[i].wei); } sort(a,a+n,cmp); int cnt=0; for(int i=0; i<n; i++) { if(a[i].wei) //避免重複的訪問 { cnt++; int record=a[i].wei; for(int j=i+1; j<n; j++) { if(a[j].wei>=record) { record=a[j].wei; a[j].wei=0; //這個點已訪問 } } } } cout<<cnt<<endl; } return 0; }