看电视(区间贪心)
看电视(区间贪心)
题目描述
暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。
现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?
现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?
输入
输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。
输出
对于每组输入,输出能完整看到的电视节目的个数。
样例输入
12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
样例输出
5
经典区间贪心,区间不相间问题:给出N个开区间,从中选取尽可能多的开区间,使其两两没有交集。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 struct Time{ 8 int x; 9 int y; 10 }T[100]; 11 12 bool cmp(Time a,Time b) 13 { 14 if(a.x!=b.x) 15 return a.x>b.x; 16 else return a.y<b.y; 17 } 18 19 int main() 20 { 21 int n; 22 while(~scanf("%d",&n)&&n) 23 { 24 for(int i=0;i<n;i++) 25 { 26 scanf("%d %d",&T[i].x,&T[i].y); 27 } 28 sort(T,T+n,cmp); 29 int num=1; 30 int lastx=T[0].x; 31 for(int i=1;i<n;i++) 32 { 33 if(T[i].y<=lastx) 34 { 35 num++; 36 lastx=T[i].x; 37 } 38 } 39 printf("%d\n",num); 40 41 } 42 return 0; 43 }
与之类似的是区间选点问题:给出N个闭区间,求最少需要确定多少个点,才能使每个闭区间中都至少存在一个点
区间选点问题只需要把区间不相交问题中的T[i].y<=lastx改为T[i].y<lastx即可,可以思考一下为什么