有一些木棍,每个有长度和重量,要求把这些木棍排成若干两个属性值均不下降的序列。问至少要分为多少个序列。
自己写的,第一次就通过了,牛逼啊~~~~~~~~~~
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct ss
{
int l,w;
bool used;
}stick;
stick s[5001];
int cmpmax1(stick a,stick b)
{
if(a.l==b.l)
return a.w<b.w;
return a.l<b.l;
}
int cmpmax2(stick a,stick b)
{
if(a.w==b.w)
return a.l<b.l;
return a.w<b.w;
}
int main()
{
int t,i,num,totalnum,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&num);
memset(s,0,sizeof(s));
for(i=1;i<=num;i++)
scanf("%d%d",&s[i].l,&s[i].w);
sort(s+1,s+1+num,cmpmax1);
int templ=s[1].l,tempw=s[1].w;
totalnum=0;
int cost=0;
while(totalnum!=num)
{
cost++;
for(i=1;i<=num;i++)
if(s[i].used==0)
{
templ=s[i].l;
tempw=s[i].w;
s[i].used=1;
totalnum++;
break;
}
for(j=i+1;j<=num;j++)
{
if(s[j].used==0 && s[j].l>=templ && s[j].w>=tempw)//实际上这里只需要比较w即可,因为l已经被事先排序。
{
s[j].used=1;
templ=s[j].l;
tempw=s[j].w;
totalnum++;
}
}
}
printf("%d\n",cost);
}
return 1;
}