早饭吃什么,这是一个深奥的问题。学校貌似好吃的也就一个鸡蛋饼,然而学校的蛋饼经常供不应求,就算排在队伍第一无奈蛋饼还在锅里,还是要等,但是站着第(mao)一(keng)不买(la)早(shi)饭是不行的,所以阿姨会让后面的买包子不买蛋饼的同学先来买,等蛋饼出锅了在按正常的队伍卖早饭,一旦蛋饼不够则优先让买包子的买。爱睡懒觉的小明总是来得较晚所以他想知道他如果他来买早饭大概需要排多久的队伍,好知道会不会迟到。
假设食堂只有一个窗口,从6.30开始供应,初始蛋饼有10个,包子无限量,大厨每隔10分钟可以做出10个蛋饼,因为蛋饼畅销所以大厨一直在做,若供应量够则每个学生需要花费1分钟来完成购买。我们已知今天买早饭的N个学生来的时间ti和买早饭的种类ki(1表示蛋饼,2表示包子)以及数量si(每个学生只卖一种不会同时买包子和蛋饼),现在给出小明来买早饭的时间,种类和数量,请帮忙计算需要排多久的队伍
多组测试数据
第一行包括买早饭的人的数量n(1<=n<=180) 接下来有n行,每行三个数据ti(06:00<=ti<=09:00),ki(1或2),si(1<=si<=100)分别表示来买的人时间种类以及数量,最后一行则表示来的是小明(保证时间没有重复)
输出小明买好早饭的时间,格式参照输入时间
- #include
- #include
- using namespace std;
- struct s
- {
- int t,k,g,f,xm;//t表示到来时刻,k买的种类,g个数,f是否购买过,xm是否是小明
- bool operator<(const s&x)const{
- return t
//按照来的时刻从早到晚排序 - }
- }a[185];
- int main()
- {
- int n,i,d,t,j,s,h,m;
- while(~scanf("%d",&n)){
- t=390,d=10;//6:30看成第390分钟,初始蛋饼有10个
- //输入每一个人的信息
- for(i=0;i
scanf("%d:%d%d%d",&h,&m,&a[i].k,&a[i].g),a[i].f=0,a[i].xm=0,a[i].t=h*60+m; - a[n-1].xm=1,i=0;
- //第n-1个就是小明,标记一下
- sort(a,a+n);
- while(1){
- s=0;//标记该时刻有无同学购买
- while(a[i].f==1) i++;//找到队伍下一个没买过的人
- if(t>=a[i].t){//表示这个人已经到达食堂
- if(a[i].k==1){//买的是蛋饼
- if(a[i].g<=d){//判断蛋饼个数是否足够
- t++,d-=a[i].g,s=1,a[i].f=1;
- //时间++,蛋饼对应减少,s=1表示有人购买,a[i].f标记此人已经购买
- if((t-390)%10==0) d+=10;//因为起点是六点半,所以要减掉390
- if(a[i].xm==1){//如果是小明,输出直接退出
- printf("%02d:%02d\n",t/60,t%60);
- goto out;
- }
- i++;
- }else{//蛋饼数量不够,需要找后面排队的包子人
- for(j=i+1;j
- if(t>=a[j].t&&a[j].k==2&&a[j].f==0){//满足条件
- a[j].f=1,t++,s=1;
- if((t-390)%10==0) d+=10;//时辰已到,蛋饼+10
- if(a[j].xm==1){
- printf("%02d:%02d\n",t/60,t%60);
- goto out;
- }
- break;
- }
- }
- }
- }else{//购买的是包子
- t++,a[i].f=1,s=1;
- if((t-390)%10==0) d+=10;
- if(a[i].xm==1){
- printf("%02d:%02d\n",t/60,t%60);
- goto out;
- }
- i++;
- }
- }
- if(s==0){//该时间点无人购买
- t++;
- if((t-390)%10==0) d+=10;
- }
- }
- out:;
- }
- return 0;
- }