2015ACM华理邀请赛 E. Exam 题解

2015ACM华理邀请赛 E. Exam 题解

Exam 题目来源:杭电5240
Time Limit: 2000/1000 MS (Java/Others) Memory Limit:
32768/32768 K (Java/Others) Total Submission(s): 70 Accepted
Submission(s): 40

Problem Description As this term is going to end, DRD needs to prepare
for his final exams.

DRD has n exams. They are all hard, but their difficulties are
different. DRD will spend at least ri hours on the i-th course before
its exam starts, or he will fail it. The i-th course’s exam will take
place ei hours later from now, and it will last for li hours. When DRD
takes an exam, he must devote himself to this exam and cannot
(p)review any courses. Note that DRD can review for discontinuous
time.

So he wonder whether he can pass all of his courses.

No two exams will collide.

Input First line: an positive integer T≤20 indicating the number of
test cases. There are T cases following. In each case, the first line
contains an positive integer n≤105, and n lines follow. In each of
these lines, there are 3 integers ri,ei,li, where 0≤ri,ei,li≤109.

Output For each test case: output ”Case #x: ans” (without quotes),
where x is the number of test cases, and ans is ”YES” (without
quotes) if DRD can pass all the courses, and otherwise ”NO” (without
quotes).

Sample Input

2
3
3 2 2
5 100 2
7 1000 2
3
3 10 2
5 100 2
7 1000 2

Sample Output

Case #1: NO
Case #2: YES

题目大意:
DRD需要准备期末考试,他有n门开始。这些考试都非常的难。DRD需要在第i门考试前花费ri个小时进行复习该课程,否则他将失败。当他开始复习第i门课时,直到考试时间ei之前,并且参加考试li个小时。在此期间,DRD不能复习其他课程。两门课程考试不会冲突。求DRD能否顺利复习完所有课程,并通过考试。

解题思路:
此题为简单的贪心算法,比赛签到题。为了完全通过课程,那么需要优先复习最早考试的科目(通过快速排序,对考试开始时间进行一级排序,对复习时间进行二级排序)。判断该科目是否能顺利通过有两个条件:
1.当前时间+复习时间>考试时间,说明不足以复习并通过考试。
2.当前时间>考试时间,说明考试已经错过。
其他仍需注意的是,若该课程能顺利通过,那么当前时间应该更新为NowTime=第i门考试时间ei+考试时长li。

#include <iostream>
#include <cstdlib>
using namespace std;
struct In       //定义DRD的考试表
{ 
    int r; 
    int e; 
    int l;
}s[100100]; 
int cmp( const void *a , const void *b )    //快排比较函数
{ 
    struct In *c = (In *)a; 
    struct In *d = (In *)b; 
    if(c->e != d->e) return c->e - d->e; 
    else return c->r - d->r; 
} 
int main()
{
    int T;
    cin>>T;
    int count=0;
    while(T--)
    {
        int n;
        cin>>n;
        count++;
        for(int i=0;i<n;i++)        //输入
            cin>>s[i].r>>s[i].e>>s[i].l;
        qsort(s,n,sizeof(s[0]),cmp);
        bool flag=true;
        int NowTime=0;
        for(int j=0;j<n;j++)    
        {
            if(NowTime>s[j].e || NowTime+s[j].r>s[j].e)
            {
                flag=false;//1.当前时间已经超过考试时间时,该课程失败
                break;//2.当前时间+复习时间超过考试时间,该课程挂科。
            }
            else
            {
                NowTime=s[j].e+s[j].l;      
            }
        }
        if(flag==true) cout<<"Case #"<<count<<": YES"<<endl;
        else cout<<"Case #"<<count<<": NO"<<endl;
    }
    return 0;
}

作者:SSPU_码农强
日期:2015.05.27

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值