hdu 4884 模拟

来源:互联网 发布:公众号排版软件 编辑:程序博客网 时间:2024/06/17 10:13

Click~~~~~~~~~http://acm.hdu.edu.cn/showproblem.php?pid=4884


这道题是Best coder #2 比赛的最后一题~

这道题首先 是题意比较恶心,它隐含的意思弄了好半天:

题意如下:

热炒饭有n中类型,,,开一次火要t分钟,每开一次火可以炒出k碗,接下来有m个人 要来买热炒饭,先来先得(这个先来先得要好好理解一下是什么意思!!!!)

最后还有一个trick :  可能会排对到第二天....第三天....,所以得取余处理下。。

Input: 看第二组数据 第一个人 8:00到,他要1类型的热炒饭 4碗,并且这个时候第二个人和第三个人还没来,所以先给第一个人炒饭,整好花一个 t分钟炒4碗给第一个人。此时已经是8:05了。。第二个人在8.01的时候就到了,而且第三个人在8.02时到了,那么在当前时刻,第二个人和
第三个人都在场,所以花一个t分钟炒4碗饭,2碗给第二个人,另外两碗给第三个人。
3 另外再说一下:炒饭可以多炒,但是多的饭给不给下个人(同一种饭)是有条件的,即当我给这个人炒饭的时候,下个人(同一种饭)有没有
出现。。。2 1 4 2 具体怎么模拟 :我也是参考了别人的代码 感觉特别神奇:用一个cnt[]数组记录某种类的米饭剩余量,用last[]数组存某种类的米饭最后一次08:00 1 5 开火的时间;09:00 2 12 5 4 308:00 1 408:01 2 208:02 2 22 5 4 208:00 1 108:04 1 1
Output:

08:0209:0108:0508:1008:1008:0508:10
附上代码:

#include <iostream>#include <cmath>#include <stdio.h>#include <string.h>using namespace std;int last[1100],cnt[1100];void print(int t){ if(t>=1440)      t=t%1440;      printf("%02d:%02d\n",t/60,t%60);}int main(){ int tt,n,t,k,m; cin>>tt; while(tt--) {  scanf("%d%d%d%d",&n,&t,&k,&m);  memset(cnt,0,sizeof(cnt));  memset(last,0,sizeof(last));  int s1,e1,r,num,cur=0;  for(int i=0;i<m;i++)  {    scanf("%d:%d%d%d",&s1,&e1,&r,&num);    s1=s1*60+e1;    if(cnt[r]>=num&&last[r]>=s1)    {      cnt[r]=cnt[r]-num;      print(last[r]+t);        continue;    }    if(cnt[r]&&last[r]>=s1)    {       num=num-cnt[r];       cnt[r]=0;     }    int x=(num-1)/k+1;    cnt[r]=x*k-num;    cur=max(cur,s1)+x*t;    last[r]=cur-t;    print(cur);    }  if(tt)cout<<endl; } return 0;   }

0 0
原创粉丝点击