洛谷 P1233 木棍加工(貪心)
阿新 • • 發佈:2018-12-06
https://www.luogu.org/problemnew/show/P1233#sub
題目描述
一堆木頭棍子共有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
先按y從大到小排序,y相等時按x從大到小排序。
因為要找出最短的時間,所以要找最長的能夠不準備的加工序列。
選完後如果還有剩餘就繼續找沒有選的那些木棍最長的不準備的加工序列。
#include<stdio.h> #include<algorithm> using namespace std; #define N 5050 struct data { int x; int y; }a[N]; int book[N]; int cmp(struct data a,struct data b) { if(a.y>b.y) return 1; if(a.y==b.y) { if(a.x>b.x) return 1; } return 0; } int main() { int n,i,ans,temp,lx,ly; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a,a+n,cmp); int m=n; ans=0; temp=0; while(m) { for(i=temp;i<n;i++) { if(book[i]==0) { temp=i; break; } } ans++; lx=a[temp].x; ly=a[temp].y; book[temp]=1; m--; for(i=temp+1;i<n;i++) { if(book[i]==0&&a[i].x<=lx&&a[i].y<=ly) { m--; lx=a[i].x; ly=a[i].y; book[i]=1; } } } printf("%d\n",ans); }