hdoj 5240 Exam 【模拟】

来源:互联网 发布:知鱼之乐 编辑:程序博客网 时间:2024/05/22 01:48

Exam

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 593    Accepted Submission(s): 298


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 leastri 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 T20 indicating the number of test cases.
There are T cases following. In each case, the first line contains an positive integern105, and n lines follow. In each of these lines, there are 3 integers ri,ei,li, where 0ri,ei,li109.

 

Output
For each test case: output ''Case #x: ans'' (without quotes), wherex 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
233 2 25 100 27 1000 233 10 25 100 27 1000 2
 

Sample Output
Case #1: NOCase #2: YES
 
纯模拟,简单题目。

题意:给你N个科目以及每个科目需要复习的时间、每个科目开始考试的时间、每个科目考试所持续的时间,问你能不能通过所有科目的考试(在考试的时候不能做任何事情)。可以用复习完上一门科目的剩余时间来复习下一门科目。

思路:按考试时间排序,模拟复习 + 考试 即可。

#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 100000+10using namespace std;struct rec{    int r, e, l;};rec num[MAXN];bool cmp(rec a, rec b){    if(a.e != b.e)        return a.e < b.e;}int N;int main(){    int t;    int k = 1;    int yu, end, now;//复习完当前科目剩余时间  当前科目考试结束时间  已经成功复习到第几门科目    scanf("%d", &t);    while(t--)    {        scanf("%d", &N);        for(int i = 0; i < N; i++)            scanf("%d%d%d", &num[i].r, &num[i].e, &num[i].l);        sort(num, num+N, cmp);        printf("Case #%d: ", k++);        if(num[0].r > num[0].e)//第一个考试时间不够复习        {            printf("NO\n");            continue;        }        end = num[0].e + num[0].l;//第一个考试结束时间        yu = num[0].e - num[0].r;//复习完还剩的时间        now = 1;        while(yu)//可以用复习后剩余的时间来复习下一门考试        {            if(num[now].r >= yu)            {                num[now].r -= yu;                yu = 0;//用完剩余时间            }            else//            {                yu -= num[now].r;                num[now].r = 0;                now++;//继续向下 复习下一门            }        }        bool flag = true;        for(int i = 1; i < N; i++)        {            if(end + num[i].r > num[i].e)//上一个结束时间加上准备时间超过 考试开始时间            {                flag = false;                printf("NO\n");                break;            }            else            {                yu = num[i].e - num[i].r - end;//剩余时间                while(yu)//继续用剩余时间复习下一门                {                    if(num[now].r >= yu)                    {                        num[now].r -= yu;                        yu = 0;                    }                    else//                    {                        yu -= num[now].r;                        num[now].r = 0;                        now++;//继续向下 复习                    }                }                end = num[i].e + num[i].l;//记录结束时间            }        }        if(flag)            printf("YES\n");    }    return 0;}


0 0
原创粉丝点击