UVA_10020
这个是刘汝佳白书上的例题,贪心策略就是按左端点对区间排序后依次扫描,在覆盖当前指定点的前提下使右端尽可能覆盖更大的区域。具体的思路可以参考刘汝佳白书的P154。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int q[5010],r[100010],L[100010],R[100010];
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return L[*p]-L[*q];
}
int main()
{
int i,j,k,n,N,M,t,tt,a,b,rear,ok;
scanf("%d",&t);
for(tt=0;tt<t;tt++)
{
scanf("%d",&M);
N=0;
while(1)
{
scanf("%d%d",&L[N],&R[N]);
if(!L[N]&&!R[N])
break;
N++;
}
for(i=0;i<N;i++)
r[i]=i;
qsort(r,N,sizeof(r[0]),cmp);
a=b=rear=0;
ok=1;
for(i=0;i<=N;i++)
{
if(b>=M)
{
rear++;
break;
}
if(i==N)
break;
if(L[r[i]]>a)
{
if(L[r[i]]>b)
{
ok=0;
break;
}
a=b;
rear++;
if(R[r[i]]>b)
{
b=R[r[i]];
q[rear]=r[i];
}
}
else if(R[r[i]]>b)
{
b=R[r[i]];
q[rear]=r[i];
}
}
if(i==N&&b<M)
ok=0;
if(tt)
printf("\n");
if(!ok)
printf("0\n");
else
{
printf("%d\n",rear);
for(i=0;i<rear;i++)
printf("%d %d\n",L[q[i]],R[q[i]]);
}
}
return 0;
}