您的位置:首页 > 其它

ZOJ-3953 Intervals,t

2017-04-16 18:37 302 查看
                                                                                                                     Intervals

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

  思路:按区间左端点排序,每次选取r最大的两个与当前比较,如果能放更新r,否则删除r最大的。关键就在怎么删除r最大的,我们可以再定义一个排序数组,按r排序即可,然后比较。struct node
{
int l,r,id;
} v[5],a
;
int b
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: