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

题目: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[N], last[N];
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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值