Click~~~~~~~~~http://acm.hdu.edu.cn/showproblem.php?pid=4884
这道题是Best coder #2 比赛的最后一题~
这道题首先 是题意比较恶心,它隐含的意思弄了好半天:
题意如下:
热炒饭有n中类型,,,开一次火要t分钟,每开一次火可以炒出k碗,接下来有m个人 要来买热炒饭,先来先得(这个先来先得要好好理解一下是什么意思!!!!)
最后还有一个trick : 可能会排对到第二天....第三天....,所以得取余处理下。。
Output: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 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
#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; }