一个厨师,他能炒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; }