问题 X: 【贪心】闭区间问题
时间限制: 1 Sec 内存限制: 64 MB提交: 15 解决: 9
[提交][状态][讨论版]
题目描述
通过魔法钟回来的张琪曼和魔法学院的其他学员一起研究营救李旭琳脱离“时空陷”的方法。他们建立了n个对历史时间线的监控点,每个监控点可监控历史上的一个时间段,我们可以简单地看做是 x 轴上 n 个闭区间。但有些监控点监控的时间段是重叠的,这会干扰监控的准确性。请尝试去掉尽可能少的闭区间,使剩下的闭区间都不相交。
输入
第一行为闭区间的个数n(1≤n≤40000),随后n行为闭区间的2个端点。
输出
输出去掉尽可能少的闭区间的个数。
样例输入
3
10 20
15 10
20 15
样例输出
2
思路:由于是闭区间,比上一题增加不相交就可以。
代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct node{ int begin; int end; }; node tt[105]; int cmp(node a,node b){ return a.end<b.end||a.end==b.end&&a.begin<b.begin; } int main() { int n; int t; int s=0; int k;//记录上一个计入的节目。 //while(scanf("%d",&n)!=EOF&&n){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d %d",&tt[i].begin,&tt[i].end); if(tt[i].begin>tt[i].end){ t=tt[i].begin; tt[i].begin=tt[i].end; tt[i].end=t; } } sort(tt,tt+n,cmp); s+=1; k=0; for(int i=1;i<n;i++){ if(tt[i].begin>tt[k].end){ s++; k=i; } } printf("%d ",n-s); s=0; //} return 0; }