ZOJ-3953-Intervals 贪心
2017-04-10 20:06
267 查看
题目大意:
A:三个区间两两重合
给你n个区间,让你从中删除几个区间,使得A不成立
题目思路:贪心。首先将区间以 左值从小到大排序
然后遍历三个区间,记x为p[0],y为p[1],从p[2]开始遍历
1. 首先判断这三个区间是否两两相交
2. 如果两两相交:则删去y值最大的那个区间(对后面影响尽量小)
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 */
相关文章推荐
- ZOJ - 3953 Intervals(贪心)
- 浙大17年校赛(ZOJ 3953) Intervals[贪心]
- ZOJ 3953 Intervals (贪心/区间交)
- ZOJ3953 Intervals 【贪心 双线程活动分配问题】
- ZOJ 3953 Intervals (贪心)
- ZOJ-3953-Intervals【贪心】【17th浙大校赛】
- ZOJ 3953 Intervals(区间贪心)
- ZOJ 3953-贪心
- ZOJ-3953 Intervals,t
- zoj3953 Intervals 最大不重叠区间加强版 zoj排名第一~
- ZOJ3953 ZJU2017校赛(贪心)
- ZOJ 3953 Intervals
- ZOJ 3953 Intervals
- zoj3953 Intervals 最大不重叠区间加强版 zoj排名第一~
- ZOJ 3953 贪心+优先队列
- zoj3953 贪心 training 3
- ZOJ 3953 Intervals
- ZOJ-3778-Talented Chef【11th浙江省赛】【贪心】
- 简单的排序+贪心 pku 1089_Intervals
- ZOJ3829-贪心|模拟-Known Notation