HDU-2037 B 今年暑假不AC

来源:互联网 发布:淘宝erp软件哪个好 编辑:程序博客网 时间:2024/04/27 20:01

今年暑假不AC

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)


Problem Description
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”

确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)
 

Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
 

Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
 

Sample Input
121 33 40 73 815 1915 2010 158 186 125 104 142 90
 

Sample Output
5
 

Author
lcy
————————————————————焦急的分割线————————————————————
思路:这道题目,是所谓的不相交区间的问题。贪心法。其实一上来就应该想到那样做。
我们来分析一下:首先我们需要选择第一个节目。怎么选择才是最明智的决策呢?最早开始?最短耗时?最早结束?但是我们知道,要选择尽量多的区间。那么问题变成了每做一次选择,都尽量使得剩下的时间能够选更多的区间。
现在,最早结束的我们最优先考虑。现在区间按照结束时间从早到晚进行了排序。
下一步,考虑最不值得的选择。假如选择一个区间,它却包含了更短耗时的区间,那就是奢侈的。因此,作出筛选,使得开始时间单调递增。
最后要考虑区间不能相交。后一个节目的开始时间必须在当前节目结束之后。回过头来,最后两步可以归结为一步。只需要不相交这个条件即可。
代码如下:
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>struct ti{    int Start;    int End;}time[110];int comp(const void *a, const void *b){    return (*(ti *)a).End - (*(ti *)b).End;}//结构体一级排序,按照结束时间从小到大排序int main(){    int n, cou;    int i, j;    while(scanf("%d", &n)!=EOF&&n){        cou = 1;        for(i = 0; i < n; i++)            scanf("%d%d", &time[i].Start, &time[i].End);        qsort(time, n, sizeof(ti), comp);        for(i = 0,j = 1; j < n; j++){            if(time[j].Start >= time[i].End){                cou++;//下一个节目在当前节目结束后开始                i = j;//更新当前节目            }//否则看下下一个节目        }        printf("%d\n", cou);    }return 0;}


0 0