链接:http://poj.org/problem?id=1065
第一根木材被处理时,时间必定为1minute。此后被处理的木材如果长度和重量都大于前一根木材则无需消耗时间,否则要消耗时间1minute。
采取贪心策略,对木材的长度进行排序(当然也可以对其重量进行排序),关键一点,当长度相等时,则应该再对重量进行排序。
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 5005
using namespace std;
struct Stick //Stick结构体,存储木棒的长度和重量
{
int l,w;
};
Stick st[MAXN];
bool vist[MAXN]; //若木棒已被处理,则木棒被访问
int cmp(Stick a,Stick b)
{
if(a.l==b.l)
return a.w-b.w<0;//当木棒长度相等时,再比较它的重量
else
return a.l-b.l<0;//若木棒长度不等,则直接比较其长度
}
int main()
{
int t,n,num,times;//times记录消耗时间
int rel,rew; //用于记录前一根木棒的长度和重量
int i,j,k;
cin>>t;
for(i=0;i<t;i++)
{
cin>>n;
for(j=0;j<n;j++)
cin>>st[j].l>>st[j].w;
sort(st,st+n,cmp);
memset(vist,false,sizeof(vist));
times=0;
num=n-1; //因为第一根被默认处理,所以num等于n-1
rel=st[0].l; //第一根木棒为前一根木棒
rew=st[0].w;
vist[0]=true; //这个条件加不加无所谓
while(num)
{
for(j=1;j<n;j++) //for循环依次寻找满足条件的木棒
if(st[j].l>=rel&&st[j].w>=rew&&!vist[j])//如果木棒长度重量长度都大于前一根木棒且未被处理
//符合条件,木棒被处理
{
vist[j]=true; //木棒被访问
num--; //木棒总数减一
rel=st[j].l; //当前木棒变成前一根木棒
rew=st[j].w;
}
times++; //无满足条件的木棒时,跳出,时间+1
int flag=false;
for(k=1;k<n;k++)
{
if(!vist[k])
{
rel=st[k].l;
rew=st[k].w;
flag=true; //还有没被访问的木棒,则要继续处理
//且第一根被选出的没有访问的木棒要作为前一根木棒被处理
}
if(flag)break;
}
}
cout<<times<<endl;
}
return 0;
}