标签:
3 2 1 4 2 08:00 1 5 09:00 2 1 2 5 4 3 08:00 1 4 08:01 2 2 08:02 2 2 2 5 4 2 08:00 1 1 08:04 1 1
08:02 09:01 08:05 08:10 08:10 08:05 08:10
解题思路:
这道模拟题太坑了......
一共有n种炒饭,每种炒饭炒一次都花t分钟,炒一次是k份的量,每次只能炒同一种炒饭,有m个客人,给出每个客人的到来时间,以及所要炒饭的种类和数量,问每个客人的最早离开时间.
一开始第三组测试数据没看懂
n=2 t=5 k=4 m=2
08:00 1 1
08:04 1 1
第一位客人8点的时候要了第一种炒饭1分,第二位客人8点04的时候要了第1种炒饭1份,那直接炒4份不就可以了吗...两位客人都是0点5分离开,坑啊,不能这样,正确的应该是这样联系实际,首先来的是第一位客人要了第一种炒饭1份,那么就得花5分钟就只炒1份,虽然这5分钟内有第二位客人来了,但是不能给他炒,等第一位客人走了以后,再给第二位客人来炒。
还有另外种情况,后面的可以加在前面炒
还是前面的数据,只不过客人的信息该为了
08:00 1 6
08:02 2 1
08:03 1 X
首先第一位客人,要了6份,因为一次最多炒4份,所以第一份炒完4份后,时间为8点05,这时候第二位和第三位都来了,正好第三位和第一位要的是一样的,那么下一次再为第一位客人炒饭(因为还差2份)时,就可以顺便为第三位客人也炒出来,如果X=2的话,那么最后一次为第一位客人炒饭,2份给它,2份给第三位个人就可以了,两位客人同时离开,如果X<2的话,假设为1,那么最后一次只要炒3份就可以了。如果X>2的话,那么炒出来2分给第三位客人留着,到了他的时候,再给他炒X-2份就够了.
写这道题,头晕晕的......
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <cmath>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cctype>
using namespace std;
#define ll long long
const int maxn=1002;//最大种类数
int n,t,K,M;//n为种类数,t为一次炒饭的时间,k为一次可以炒多少份,m是有m个客人
bool done[maxn];
struct Customer
{
int h,m;
int time;
int kind;
int num;
int ans;
}cus[maxn];
void output(int t)
{
int h=t/60;
h%=24;
int m=t%60;
if(h<=9)
printf("0%d:",h);
else
printf("%d:",h);
if(m<=9)
printf("0%d\n",m);
else
printf("%d\n",m);
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&n,&t,&K,&M);
memset(done,0,sizeof(done));
for(int i=1;i<=M;i++)
{
scanf("%d:%d %d %d",&cus[i].h,&cus[i].m,&cus[i].kind,&cus[i].num);
cus[i].time=cus[i].h*60+cus[i].m;
}
int curtime=-1;//当前时间
for(int i=1;i<=M;i++)
{
if(done[i])
continue;
if(cus[i].time>=curtime)
curtime=cus[i].time;
int c=(cus[i].num)/K;//为第i个顾客需要炒几次饭
if(cus[i].num%K!=0)
c++;
//cout<<"tt"<<tt<<endl;
cus[i].ans=curtime+c*t;//第i个顾客离开时间
//int curt=curtime+cus[k].num/K*t;
int curt=cus[i].ans-t;//为第i个顾客最后一次炒饭开始的时间,
//因为这时候要看看后面的顾客有没有和当前顾客要的一样的,顺带着“炒出来一部分”
curtime=cus[i].ans;
int left=c*K-cus[i].num;//最后一次可以多炒一部分,比如每次炒4份,当前顾客要10份,那么得炒3次,第三次炒可以炒4份,那么就会多出来2份
done[i]=1;
// cout<<"kk"<<k<<"left"<<left<<endl;
for(int j=i+1;j<=M;j++)
{
if(cus[j].time>curt)
break;
if(cus[j].kind!=cus[i].kind)
continue;
if(left>=cus[j].num)//当前顾客多出的饭可以直接给后面需要的
{
// cout<<"inininininin"<<endl;
cus[j].ans=cus[i].ans;
done[j]=1;
left-=cus[j].num;
}
else
{
cus[j].num-=left;
left=0;
break;
}
}
//kindn[cus[k].kind]+=left;
//cout<<cus[k].kind<<" sssssssss "<<left<<endl;
}
for(int i=1;i<=M;i++)
output(cus[i].ans);
if(T)
printf("\n");
}
return 0;
}
[ACM] HDU 4884 TIANKENG’s rice shop (模拟)
标签:
原文地址:http://blog.csdn.net/sr_19930829/article/details/42679105