来源:http://poj.org/problem?id=1065
题意:有一些木材和一台机器。机器每次加工一根木材需要的时间是1,但是当加工木材的长度和宽度都小于等于前一根木材的时候,不需要时间。求最少需要多少时间加工完所有的木材。
思路:挺水的一道贪心题目。从小到达排序,然后依次扫描即可。写了个o(n*n)的,竟然16ms,数据水了。
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 5050;
struct stick{
int len,wid;
}ss[N];
bool cmp(stick a,stick b){
if(a.wid == b.wid)
return a.len < b.len;
return a.len < b.len;
}
int main(){
//freopen("1.txt","r",stdin);
int numcase;
scanf("%d",&numcase);
while(numcase--){
int n;
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%d%d",&ss[i].len,&ss[i].wid);
sort(ss,ss+n,cmp);
int tt = 0,flag[N];
memset(flag,0,sizeof(flag));
for(int i = 0; i < n; ++i){
if(flag[i])
continue;
int id = i;
for(int j = i+1; j < n; ++j){
if(ss[j].len >= ss[id].len && ss[j].wid >= ss[id].wid && !flag[j]){
flag[j] = 1;
id = j;
}
}
}
for(int i = 0; i < n; ++i)
if(!flag[i])
tt++;
printf("%d\n",tt);
}
return 0;
}