成都东软学院ACM2017冬季校赛 没办法,简单题都被平头和祥抢完了。只有我来给你们出一道难题了,但是请你们相信我,我是一个良心学长。

来源:互联网 发布:水果网络营销策划方案 编辑:程序博客网 时间:2024/04/28 07:53

问题 C: Callous problem

题目描述:

没办法,简单题都被平头和祥抢完了。只有我来给你们出一道难题了,但是请你们相信我,我是一个良心学长。

咳咳咳。说正题!

相信大家在寒暑假的时候在家基本都是看电视,当然,作为一个新时代的ACMer,“哪吒”学姐肯定会看很多的动画片:哪吒传奇、哪吒闹海、哪吒前传等等,而现在的电视机很高端,它能给你显示你喜欢看的动画片的播出时间表(比如9点30分少儿频道的哪吒闹海),“哪吒”学姐作为哪吒的忠实粉丝,所以她想尽可能多的看完整的哪吒动画片节目,那问“哪吒”学姐能最多看多少节目呢?

输入:

测试数据有多组,对于每组测试数据:

第一行有一个整数n(n <= 100),表示你喜欢看的节目的总数

然后是n行数据,每行包括两个整数li,ri,分别表示第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

解题思路:

本提要求算出学姐最多能完全看完的节目数,本题是一个区间贪心问题 我们可以将每个节目按结束时间从大到小排序, 因为最早结束的节目一定是最优的, 这样排序后第一个节目我们一定会选, 因为第一个节目的结束时间一定是最早的,可以定义一个结构体数组 struct node{int l,r}node[1000];l和r分别保存节目的开始和结束时间 排好序过后 就可以用一个for循环遍历一次结构体数组。当下一个节目的开始时间大于等于上一个节目的结束时间就ans++,遍历结束过后就可以直接输出答案ans了。

下面是题解代码:

#include<cstdio>
#include <algorithm>
using namespace std;
struct node
{
    int l,r;
}num[1000];


bool cmp(node a,node b)
{
    if(a.r<b.r)
        return true;
    else if(a.r==b.r)
    {
        if(a.l<b.l)
            return true;
        return false;
    }
    return false;


}
int main()
{
    int n,ans,k;
    while(scanf("%d",&n)&&n)
    {
        for(int i =1;i<=n;i++)
        scanf("%d%d",&num[i].l,&num[i].r);
        sort(num+1,num+n+1,cmp);
        ans=0;
        k=1;
        for(int i =2;i<=n;i++)
        {
            if(num[k].r<=num[i].l)
            {
                 ans++;
                 k=i;
            }
        }
        printf("%d\n",ans+1);
    }
    return 0;
}

阅读全文
1 0
原创粉丝点击