由于顺序可以改变,所以纯贪心解决。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
struct stick{
int u,v,num;
}S[5010],stack[5010];
unsigned char vis[5010];
int top;
int cmp(const void *a,const void *b){
int k=(*(stick *)a).u-(*(stick *)b).u;
if(k)return k;
else return (*(stick *)a).v-(*(stick *)b).v;
}
void init(int c){
if(c)memset(S,0,sizeof(S));
memset(stack,0,sizeof(stack));
if(c)memset(vis,0,sizeof(vis));
top=0;
stack[0].u=stack[0].v=-1;
}
void push(int x){
top++;
stack[top].u=S[x].u;
stack[top].v=S[x].v;
stack[top].num=x;
vis[x]=1;
}
void pop(){
if(top>0){
vis[stack[top].num]=0;
top--;
}
}
int main(){
int t,n,i,j,k,flag,sum,cnt,pu,pv;
scanf("%d",&t);
for(i=1;i<=t;i++){
sum=cnt=0;
pu=pv=-1;
init(1);
scanf("%d",&n);
for(j=1;j<=n;j++){
scanf("%d%d",&S[j-1].u,&S[j-1].v);
S[j-1].num=j-1;
}
qsort(S,n,sizeof(S[0]),cmp);
while(sum!=n){
pu=pv=-1;
/*printf("Sum=%d.\n",sum);
getchar();
printf("***********\n");
for(j=0;j<n;j++){
printf("%d ",vis[j]);
}
printf("\n************\n");*/
for(j=0;j<n;j++){
if((S[j].u>=pu)&&(S[j].v>=pv)&&!vis[j]){
vis[j]=1;
pu=S[j].u;
pv=S[j].v;
sum++;
}
else{
continue;
}
}
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
每次找出一个合法的序列,元素尽量靠前。