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掉。
题意,就是有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; }
相关文章推荐
- HDU 4884 Bestcoder#2-1002 TIANKENG’s rice shop【模拟一发】
- HDU 4884 TIANKENG’s rice shop(模拟)——BestCoder Round #2
- [ACM] HDU 4884 TIANKENG’s rice shop (模拟)
- HDU 4884 TIANKENG’s rice shop (模拟)
- hdu--4884--TIANKENG’s rice shop【模拟】
- hdu 4884 TIANKENG’s rice shop(模拟)
- hdu 4884 TIANKENG’s rice shop(模拟)
- HDU 4884 TIANKENG’s rice shop (模拟)
- hdu 4884 TIANKENG’s rice shop(模拟)
- HDU-4884-TIANKENG’s rice shop【模拟】
- hdu 4884 TIANKENG’s rice shop(模拟)
- HDU TIANKENG’s rice shop(模拟)
- 【CUGBACM15级BC第二场 B】hdu 4884 TIANKENG’s rice shop
- HDU TIANKENG’s rice shop(模拟)
- hdu 4884 TIANKENG’s rice shop && BestCoder Round #2 1002
- HDU-4884-TIANKENG’s rice shop
- hdu4884 TIANKENG’s rice shop【模拟】
- HDU4884 TIANKENG’s rice shop【模拟】
- TIANKENG’s rice shop
- HDU4884 TIANKENG’s rice shop