您的位置:首页 > 运维架构

HDU 4884 —— TIANKENG’s rice shop(模拟)

2014-07-28 12:12 309 查看
题目:TIANKENG’s rice shop

题意,就是有N种炒饭,每次炒的时间是t分钟,每次最多炒k份,然后按照进店的顺序给出m个顾客的信息,进店时间,炒饭的编号以及份数。然后要输出每个顾客离开的时间。

题目中告诉了我们炒饭的规则,按照先来先服务,但是每次炒会炒尽可能多的份数,不过不会有多余的。

举个例子,比如每次可以炒5份,每次5分钟。

第一个顾客08:00进来,点了2份A,

第二个顾客08:04进来,点了3份A。

在08:00开始炒的话,由于这个时候第二个顾客还没进来,所以就只炒2份,第一个顾客在08:05离开,这时才炒第二个的3份,所以第二个离开时间是08:10。

同样是每次可以炒5份,每次5分钟。

第一个顾客08:00进来,点了6份A,

第二个顾客08:01进来,点了5份B,

第三个顾客08:02进来,点了4份A。

同样地,先炒5份给第一个,还差一份,这是已经是08:05了,第三个顾客也进来了,所以这时直接炒5份A(因为会尽可能多地炒),08:10第一个和第三个可以同时离开。接着才炒第二个的。

具体模拟的话,我是用一个cnt[i]表示编号i的炒饭还剩下多少份,并且最后一次炒的时间last[i]。

那么读到一个时间hh:mm,先判断这个编号的炒饭有没有剩余,进来的时间是否比最后一次炒的时间早,只有比这个时间早才有可能提前为他炒。

如果剩余的数量足以供应了,就直接输出last[i]+t

否则求出剩余的量还需要的时间,并且更新cnt[i]和last[i]。

然后这题还有一个trick的地方(至少SB的我是被卡在这里的= =),就是有可能进店的时间和出店的时间不在同一天,比如23:59进来,炒饭用了5分钟,离开的时候是00:04而不是24:04,我因为先将时间换成分钟计算,最后转换回来时没有判断WA掉。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int N = 1010;
const int lim = 24*60;
int T, n, t, k, m;
int cnt
, last
;
void print(int time){
if(time>=lim)   time%=lim;
printf("%02d:%02d\n", time/60, time%60);
}
int main(){
scanf("%d", &T);
while(T--){
scanf("%d %d %d %d", &n, &t, &k, &m);
memset(cnt,0,sizeof(cnt));
int hh, mm, a, b;
int cur = 0;
for(int i=0; i<m; i++){
scanf("%d:%d %d %d", &hh, &mm, &a, &b);
hh = hh*60+mm;
if(cnt[a]>=b && last[a]>=hh){
cnt[a]-=b;
print(last[a]+t);
continue;
}
if(cnt[a] && last[a]>=hh){
b-=cnt[a];
}
int x = (b-1)/k + 1;
cur = max(cur, hh) + t*x;
print(cur);
cnt[a] = x * k - b;
last[a] = cur - t;
}
if(T)   puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: