这题要用贪心法,先对所有木棒的l或w进行排序并全部标记为0,然后从第一根木棒进行检索,找到符合 l<=l' w<=w'的木棒并标记为1,检索完一遍以后又从第一个标记为0的木棒开始检索,直到全部标记为1。
#include <stdio.h>
#include <stdlib.h>
struct wood
{
int l;
int w;
int flag;
};
struct wood a[5000+10];
struct wood b[5000+10];
int main()
{
int t,m,n,i,j,temp,time,count,sum;
struct wood head;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].l,&a[i].w);
a[i].flag=0;
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i].l>a[j].l||(a[i].l==a[j].l&&a[i].w>a[j].w))
{
temp=a[i].l;
a[i].l=a[j].l;
a[j].l=temp;
temp=a[i].w;
a[i].w=a[j].w;
a[j].w=temp;
}
}
}
time=0;
head.l=a[0].l;
head.w=a[0].w;
a[0].flag=1;
sum=1;
do{
for(i=1;i<n;i++)
{
if(a[i].flag==0&&head.l<=a[i].l&&head.w<=a[i].w)
{a[i].flag=1;
head.l=a[i].l;
head.w=a[i].w;
sum++;}
}
time++;
for(i=0;i<n;i++)
{
if(a[i].flag==0)
{
head.l=a[i].l;
head.w=a[i].w;
break;
}
}
}while(sum!=n);
printf("%d\n",time);
}
return 0;
}