您的位置:首页 > 其它

ZOJ-3953-Intervals 贪心

2017-04-10 20:06 267 查看
题目大意:

A:三个区间两两重合

给你n个区间,让你从中删除几个区间,使得A不成立

题目思路:贪心。首先将区间以 左值从小到大排序

然后遍历三个区间,记x为p[0],y为p[1],从p[2]开始遍历

1. 首先判断这三个区间是否两两相交

2. 如果两两相交:则删去y值最大的那个区间(对后面影响尽量小)
#include <bits/stdc++.h>
using namespace std;

struct node{
int a,b,idx;
}p[50005];
bool cmp(node a, node b)
{
if (a.a != b.a) return a.a < b.a;
else return a.b < b.b;
}
bool cmp2(node a, node b)
{
if (a.b != b.b) return a.b > b.b;
else return a.a < b.a;  //可以不需要
}
bool isIntervals(node x, node y, node z)  //判断这三个集合是否相交
{
int f1 = y.a <= x.b;  //x与y相交
int f2 = (z.a <= x.b) && (z.a <= y.b);  //z与x,y相交
if (f1 && f2) return 1;
else return 0;
}

int ans[50005];
int main()
{
int _;
cin >> _;
while(_--)
{
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
p[i].idx = i + 1;
}
sort(p, p + n, cmp);
node x[5];
x[0] = p[0]; x[1] = p[1];
int pos = 0;
for (int i = 2; i < n; i++)
{
x[2] = p[i];
sort(x, x + 3, cmp);
int f = isIntervals(x[0],x[1],x[2]); //如果这三个集合相交
sort(x, x + 3, cmp2);
if (f)
{
ans[pos++] = x[0].idx;
swap(x[0],x[2]);  //删去y最大的那个
}
}
sort(ans, ans + pos);
cout << pos << endl;
if (pos > 0) cout << ans[0];
for (int i = 1; i < pos; i++) cout << " " << ans[i];
cout << endl;
}
return 0;
}
/*
2
6
1 2
2 3
3 4
3 5
3 6
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: