hdu4884 模拟

题意:
      一个厨师,他能炒n道菜,他每次炒菜用时t分钟,每次最多可以炒同样的菜k分,有m个人来买饭,给你每个人来的时间和菜的种类以及份数,问你每个人都是什么时候离开的。


思路:

      这种题目,直接模拟没话说,没啥好提供思路的,就说一个地方吧,做这种模拟题的时候要结合实际去做,比如现在来了一个人,他要炒菜12份,你每次最多炒菜5份,那也就是所要炒3次,那么第三次炒之前又来了一个人,要炒同样的菜若干份,你第三次还可以在多炒三次,那么就多炒三份呗,(省燃料了)。如果后来的这个人要的份数小于等于3那么这两个人就是一起走的呗,否则就先给他炒出来3份,差多少等排队轮到他再说,别硬模拟,想好了再写会方便很多。

#include<stdio.h>
#include<string.h>

typedef struct
{
   int ans ,time ,id ,g;
}NODE;
NODE P[1005];

int main ()
{
    int nowtime ,i ,j;
    int n ,t ,k ,m ,h ,f ,T;
    scanf("%d" ,&T);
    while(T--)
    {
         scanf("%d %d %d %d" ,&n ,&t ,&k ,&m);
         for(i = 1 ;i <= m ;i ++)
         {
            scanf("%d:%d %d %d" ,&h ,&f ,&P[i].id ,&P[i].g);
            P[i].time = h * 60 + f;
            P[i].ans = -1;
         }
          nowtime = P[1].time;
          for(i = 1 ;i <= m ;i ++)
          {
               if(P[i].ans != -1) continue;
               if(P[i].time > nowtime) nowtime = P[i].time;
               int tt = (P[i].g + k - 1) / k * t;
               P[i].ans = nowtime + tt;
               int zuihouyiguo = nowtime + P[i].g / k * t;
               nowtime = P[i].ans;
               int shengyu = tt / t * k - P[i].g;
               for(j = i + 1 ;j <= m && shengyu;j ++)
               {
                  if(P[j].time > zuihouyiguo) break;
                  if(P[j].id != P[i].id)continue;
                  if(shengyu >= P[j].g)
                  {
                     P[j].ans = P[i].ans;
                     shengyu -= P[j].g;
                  }
                  else
                  {
                     P[j].g -= shengyu;
                     shengyu = 0;
                  }
               }
            }
            for(i = 1 ;i <= m ;i ++)
            printf("%02d:%02d
" ,P[i].ans / 60 % 24 ,P[i].ans % 60);
            if(T) puts("");
      }
      return 0;
}



原文地址:https://www.cnblogs.com/csnd/p/12062915.html