【HDOJ】4884 TIANKENG's rice shop

简单模拟,注意并不是完全按照FIFO的顺序。比如第i个人的id为k,那么就算第i+1人的id不为k,也会检查他后续的排队人是否有id为k的。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 
 5 #define MAXN 1005
 6 
 7 typedef struct {
 8     int tt;
 9     int id;
10     int num;
11     int ans;
12 } need_st;
13 
14 need_st needs[MAXN];
15 
16 int main() {
17     int t, n, k, m, T;
18     int i, j, hh, mm, tt, tmp;
19 
20     scanf("%d", &T);
21     while (T--) {
22         scanf("%d%d%d%d", &n,&t,&k,&m);
23         for (i=0; i<m; ++i) {
24             scanf("%d:%d %d %d", &hh, &mm, &needs[i].id, &needs[i].num);
25             needs[i].tt = 60*hh+mm;
26         }
27         tt = 0;
28         for (i=0; i<m; ++i) {
29             if (needs[i].num == 0)
30                 continue;
31             if (tt < needs[i].tt)
32                 tt = needs[i].tt;
33             tmp = needs[i].num%k;
34             tt += needs[i].num/k*t;
35             if (tmp > 0) {
36                 for (j=i+1; j<m&&needs[j].tt<=tt; ++j) {
37                     if (needs[j].id == needs[i].id) {
38                         if (needs[j].num+tmp > k) {
39                             needs[j].num -= (k-tmp);
40                             break;
41                         } else {
42                             tmp += needs[j].num;
43                             needs[j].num = 0;
44                             needs[j].ans = tt+t;
45                         }
46                     }
47                 }
48                 tt += t;
49             }
50             needs[i].ans = tt;
51         }
52         for (i=0; i<m; ++i)
53             printf("%02d:%02d\n", needs[i].ans/60%24, needs[i].ans%60);
54         if (T)
55             printf("\n");
56     }
57 
58     return 0;
59 }

 

posted on 2014-09-14 09:49  Bombe  阅读(195)  评论(0编辑  收藏  举报

导航