hzu3-Queue at the Exam

描述:

一组学生有一个口头测试。在测试开始前,所有学生同时收到他们的问题并开始准备,每个学生需要T1分钟去准备,T2分钟去答题(这些T参数对于不同的学生来说可以是不同的)。对于每个学生,时间T3(从考试开始的时刻算起)将会被给出,这表明这个学生必须在此时开始是不被这个考试所占用时间的,从而他可以去做别的事情(例如,别的考试)。

在考试期间,学生将按照可以去回答的顺序组成一个等待的队列。如果说一个学生准备好回答了,并且此时教授刚好空闲,那么这个学生立马开始回答问题。如果教授此刻正忙着听其他人的回答,那么这个学生立马加入到等待队列,而且在他之前的学生回答完后他开始回答。

一些学生可能在他们计划的时间后没有空闲下来(i.e,在时间T3后)。教授可以配合和将测试的时间提前到一个比较靠前的时间。然而,他并不想来得太早!你的任务就是写一个程序计算考试应该提前的最少的时间,以让所有学生都能在他们计划的T3之前前完成测试。

输入:

第一行包括学生数N(1<=N<=40).接下来的N行,每一行包括相应的数据T1,T2和T3.

数据由一个空格隔开,而且约束是0<=T1<=T3<=600,1<=T2<=240.所有的T1是不同的。

输出:

输出一个非负整数表示问题的答案。如果不需要提前开始考试,输出0

样例输入:

解题思路:

这道题可以从学生的T1和T3入手,因为我解题时,没看到说T1是不相同,所以将T1是相同的情况也考虑进去了。对于T1小的学生,意味着他肯定先开始答题。而如果T1相等的两个学生,那么肯定要让先有事的那个学生先答题(可以手算下,就知道原因了)。那么,

开始答题,考虑当前学生的准备时间。一种情况是:前面的学生已经全都答完了,他还在准备。一种情况是:他准备好了,但还有学生在答题。所以他开始的时间,必定是前面学生花费的时间和他准备的时间的最大值,设为sum。而后,他开始答题,那么他答题完后就是sum+T2,这是新的sum,如果这个时候,这个sum超过了当前学生的T3,则代表应该提前当前学生T3减去经过的时间,那么,每一次对于新的答题学生来一次检测,判断他是否需要将考试时间提前,而后取所有要提前的时间中的最大值,这个即为程序的解

#include

#include

#include

usingnamespacestd;

structnode

{

intta,tb,tc;

booloperator<(constnode&t)const

{

if(ta

{

returntrue;

}

elseif(ta>t.ta)

{

returnfalse;

}

else

{

returntc

}

returntrue;

}

}node[45];//重载,让T1小的先答题,如果T1相等,让T3小的先答题。

intmain()

{

intt;

cin>>t;

for(inti=0;i

{

cin>>node[i].ta>>node[i].tb>>node[i].tc;

}

sort(node,node+t);//快排,依据T1和T3排

intmaxn=0,tmp=0;

intans=0;

inttt;//中间值

for(inti=0;i

{

tt=node[i].ta;//取当前学生的准备时间

maxn=max(tmp,tt);//取已花费的时间和当前学生准备时间的最大值

//printf("%d\n",maxn);

tmp=maxn;

tmp+=node[i].tb;//当前学生开始答题,答完后消耗的时间

if(tmp>node[i].tc){//如果学生答完题后时间已经超过他的T3,则将时间提前,并和之前的提前时间比较,取较大的那个

ans=max(ans,tmp-node[i].tc);

}

}

printf("%d\n",ans);

return0;

}

�o����u

你可能感兴趣的:(hzu3-Queue at the Exam)