Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 212 Accepted Submission(s): 9
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 using namespace std; 6 const int N = 1010; 7 const int lim = 24*60; 8 int T, n, t, k, m; 9 int type[N];//表示上一个顾客走后,第N种饭的空缺; 10 int last[N];//开始做上一个顾客,最后一轮饭的时间 11 void print(int time) 12 { 13 if(time>=lim) time%=lim; 14 printf("%02d:%02d\n", time/60, time%60); 15 } 16 int main(){ 17 scanf("%d", &T); 18 while(T--){ 19 scanf("%d %d %d %d", &n, &t, &k, &m); 20 memset(type,0,sizeof(type)); 21 int hh, mm, a, b; 22 int cur = 0; 23 for(int i=0; i<m; i++){ 24 scanf("%d:%d %d %d", &hh, &mm, &a, &b); 25 hh = hh*60+mm; 26 /*如果a钟饭还能做的份数,大于b, 27 并且这一轮的开始时间大于他来的时间 28 例如:2 5 5 3 29 08:06 1 8 做他的第二轮的时候,顺便把三号的也做了(可以这样) 30 08:07 2 11 31 08:08 1 1 32 */ 33 if(type[a]>=b && last[a]>=hh) 34 { 35 type[a]-=b; 36 print(last[a]+t); 37 continue; 38 } 39 //如果上一轮剩余的不够了,就先把剩余的减去; 40 if(type[a] && last[a]>=hh){ 41 b-=type[a]; 42 } 43 int x = (b-1)/k + 1;//做他的饭需要的总时间 44 cur = max(cur, hh) + t*x; 45 print(cur); 46 type[a] = x * k - b;//类型剩余量 47 last[a] = cur - t;//做最后一轮饭的开始时间 48 } 49 if(T) puts(""); 50 } 51 return 0; 52 }
HDOJ 4884 & BestCoder#2 1002,布布扣,bubuko.com
原文:http://www.cnblogs.com/lovychen/p/3875733.html