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 least
r
i![]()
hours on the i
-th
course before its exam starts, or he will fail it. The
i
-th
course's exam will take place e
i![]()
hours later from now, and it will last for l
i![]()
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.
DRD has n
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≤10
5![]()
,
and n
lines follow. In each of these lines, there are 3 integers
r
i
,e
i
,l
i![]()
,
where 0≤r
i
,e
i
,l
i
≤10
9![]()
.
There are T cases following. In each case, the first line contains an positive integer n≤10
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
纯模拟,简单题目。
题意:给你N个科目以及每个科目需要复习的时间、每个科目开始考试的时间、每个科目考试所持续的时间,问你能不能通过所有科目的考试(在考试的时候不能做任何事情)。可以用复习完上一门科目的剩余时间来复习下一门科目。
思路:按考试时间排序,模拟复习 + 考试 即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 100000+10
using 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;
}