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