ZOJ-3953 Intervals,t

来源:互联网 发布:linux echo 编辑:程序博客网 时间:2024/05/16 13:41

                                                                                                                     Intervals

  题意:给出n个区间,求最少删除多少个区间使得任意三个区间都不相交。

  思路:按区间左端点排序,每次选取r最大的两个与当前比较,如果能放更新r,否则删除r最大的。关键就在怎么删除r最大的,我们可以再定义一个排序数组,按r排序即可,然后比较。

struct node{    int l,r,id;} v[5],a[N];int b[N];bool cmp(node x,node y){    if(x.l==y.l) return x.r<y.r;    return x.l<y.l;}bool cmp2(node a,node b){    return a.r>b.r;}bool judge(node i,node j,node k){    int f=0;    if(i.r>=j.l&&i.r>=k.l) f++;    if(j.r>=k.l) f++;    return f==2;}int main(){    int t,n;    scanf("%d",&t);    while(t--)    {        memset(b,0,sizeof(b));        scanf("%d",&n);        for(int i=1; i<=n; i++) scanf("%d%d",&a[i].l,&a[i].r),a[i].id=i;        sort(a+1,a+n+1,cmp);        v[0]=a[1],v[1]=a[2];        int len=0;        for(int i=3; i<=n; i++)        {            v[2]=a[i];            sort(v,v+3,cmp);            int f=judge(v[0],v[1],v[2]);            sort(v,v+3,cmp2);            if(f)//相交            {                b[len++]=v[0].id;                swap(v[0],v[2]);//删除r最大的;            }        }        sort(b,b+len);        printf("%d\n",len);        for(int i=0; i<len; i++)            printf("%d ",b[i]);        printf("\n");    }    return 0;}




0 0