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

来源:互联网 发布:网络信息发布规范 编辑:程序博客网 时间:2024/06/05 14:31

题意:有 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 1440pii 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("");    }}


0 0
原创粉丝点击