Hold不住的老师 HNUST 1588

题目描述
 因为我们学校ACM集训队取得的一个个优异成绩,ACM/ICPC越来越受到学校重视。学校为了提高大家的编程与算法能力,决定开设更多的上机课。但是大家的学习热情实在太高了,提出来的问题层出不穷,我们的老师们Hold不住了,于是老师决定让我们优秀的集训队员们来给大家指导上机。我们集训队的队员们精力非常充沛,一天到晚都是空闲时间,只要老师召唤并且要去指导的上机课的时间不冲突,那他们就一定会去指导小学弟和小学妹们(主要是小学妹们←.←)。每节上机课必须有且只有一个队员指导,但是一个队员可以连续指导多节上机课,只要时间不冲突。所谓时间不冲突,就是指要去指导的上机课的时间不重叠(比如1-3和2-4就冲突,而1-5和5-10就不冲突)。可是现在,轮到安排队员去上课的老师Hold不住了,因为他不知道这一天最少要安排多少队员来给大家上课,老师需要一个真正的ACMer来帮助他,你可以吗?

输入
输入包含多组数据。

每一组数据第一行有一个整数N(0 <= N < 1000),表示这一天上机课的数目。 接下来N行,每行有两个整数S和T, (0 <= S < T <= 24), 表示该上机课的开始时刻和结束时刻。

输出
输出一个整数代表这一天最少需要多少队员

样例输入
6
1 5
2 3
3 4
6 7
8 9
10 12
样例输出
2
提示

 Sample里面只需要两个队员,一个上1门课(1-5),另外一个上5门课(2-3,3-4,6-7,8-9,10-12).

思路:贪心:如果第二个循环课程的开始时间大于第一个循环课程的结束时间,则更新第一个循环课程的结束时间为第二个循环课程的结束时间

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
int flag[1005];
struct data{
   int a;
   int b;
}stu[1005];
bool cmp(data c,data d)
{
    if(c.a!=d.a)
        return c.a<d.a;
    else
        return c.b>d.b;
}
int main()
{
    int n;
    while(scanf("%d",&n)==1){
    for(int i=1; i<=n; i++)
        scanf("%d%d",&stu[i].a,&stu[i].b);
    memset(flag,0,sizeof(flag));
    sort(stu+1,stu+1+n,cmp);
    for(int i=1; i<=n; i++)
    {
        if(flag[i]==0)
            for(int j=1; j<=n; j++)
            {
                if(i!=j&&flag[j]==0)
                {
                    if(stu[j].a>=stu[i].b)
                    {
                        stu[i].b=stu[j].b;
                        flag[j]=1;
                    }
                }
            }
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(flag[i]==0)
            cnt++;
    }
    cout<<cnt<<endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值