hdu 4884 TIANKENG’s rice shop && BestCoder Round #2 1002

24 篇文章 0 订阅
3 篇文章 0 订阅

题意:有 N 种饭,每种饭做一轮耗时间为 T ,每一轮可以做 K 碗饭,下面是 M 个人;顺序已经排好了,当然是

先到先得了;

题解:就是模拟吧.不过有一些需要注意的地方

1.如果给当前这个人做饭,锅还剩余一些容量,可以顺便给后面已经排队的人做一些(不一定非限于队头的那个

人)2.最后输出的时候需要按照来的时间顺序输出3.貌似可能有超过23.59的情况,需要mod

总结:这个题还是花费了不少时间,1.首先需要注意的感觉还是,如果一个题半天都没改对,就应该放手去做一些

其他的事情,死扣会让头脑钻牛角尖,2.其次就是开始感觉这个题不是那么的难,就没有仔细想清楚,就开始敲代

码了,感觉这是一个非常不好的习惯,再有把握的事情也需要先做好必要的准备工作吧,浪费了一点准备时间,反

而可能节约很多的实际工作时间


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef pair<int,int>pii;
#define MAXN 1010
#define MOD 1440
pii ans[MAXN];
struct Customer
{
    int minute,id,num;
}customer[MAXN];
int _,n,t,k,m,u,v;
void deal(int i,int now,int remainder)
{
    for(int j = i + 1;j < m && customer[j].minute <= now;j++)
        if(customer[j].id == customer[i].id)
        {
            if(remainder >= customer[j].num)
            {
                remainder -= customer[j].num;
                ans[j] = pii((now + t) % MOD / 60,(now + t) % MOD % 60);
                customer[j].num = 0;
            }
            else
            {
                customer[j].num -= remainder;
                break;
            }
        }
}
int main()
{
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d%d%d%d",&n,&t,&k,&m);
        for(int i = 0;i < m;i++)
        {
            scanf("%d:%d %d %d",&u,&v,&customer[i].id,&customer[i].num);
            customer[i].minute = u * 60 + v;
            while(i && customer[i].minute < customer[i - 1].minute)
                customer[i].minute += MOD;
        }
        int now = customer[0].minute;
        for(int i = 0;i < m;i++)
        {
            now = max(customer[i].minute,now);
            int num = customer[i].num;
            if(!num)continue;
            now += t * (num / k);
            if(num % k == 0)
                ans[i] = pii(now % MOD / 60,now % MOD % 60);
            else
            {
                ans[i] = pii((now + t) % MOD / 60,(now + t) % MOD % 60);
                deal(i,now,k - num % k);
                now += t;
            }
        }
        for(int i = 0;i < m;i++)
            printf("%02d:%02d\n",ans[i].first,ans[i].second);
        if(_)puts("");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值