ZOJ 1025

由于顺序可以改变,所以纯贪心解决。

#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;
}

		

每次找出一个合法的序列,元素尽量靠前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值