首页 > 学院 > 开发设计 > 正文

暑假不AC

2019-11-14 12:27:18
字体:
来源:转载
供稿:网友
“今年暑假不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 90Sample Output5

题解:先把每一段时间用结构体记录下来,然后根据结束的时间进行排序,如果遇到结束时间相同的,就把开始时间按照升序进行排列。排列完后把结束的时间和后一段开始的时间进行比较,如果后一段开始的时间在前一段结束的时间之后,就选择这一段进行观看。

我的代码:

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<iomanip>#include<string.h>using namespace std;struct TM{ //注意这里不能用time作结构体名字,因为time本身是个函数。         int s, e;}t[110];int cmp(TM a, TM b){    if (a.e == b.e)        return a.s > b.s;//如果结束时间相同,开始时间越大的,观看时间越短,越看更多的节目    return a.e < b.e;//第一约束条件还是结束时间,因为节目结束时间决定了最终观看结束时间}int main(){    int n, i;    while(scanf("%d", &n),n)    {        int k = 1, exa;        for (i = 0; i < n; i++)        scanf ("%d %d", &t[i].s, &t[i].e);            sort(t, t+n, cmp);            exa = t[0].e;        for (i = 0; i < n; i++)        {            if(t[i].s >= exa)//如果节目的开头大于前一段的结尾,则选择这一个节目。            {                exa = t[i].e;                k++;            }        }        cout << k << endl;        }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表