hdu4884 模拟

来源:互联网 发布:在线网络理财排行榜 编辑:程序博客网 时间:2024/05/16 12:29
题意:
      一个厨师,他能炒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\n" ,P[i].ans / 60 % 24 ,P[i].ans % 60);            if(T) puts("");      }      return 0;}



0 0
原创粉丝点击