• ZCMU--1577: 食堂的蛋饼


    Description

       早饭吃什么,这是一个深奥的问题。学校貌似好吃的也就一个鸡蛋饼,然而学校的蛋饼经常供不应求,就算排在队伍第一无奈蛋饼还在锅里,还是要等,但是站着第(mao)一(keng)不买(la)早(shi)饭是不行的,所以阿姨会让后面的买包子不买蛋饼的同学先来买,等蛋饼出锅了在按正常的队伍卖早饭,一旦蛋饼不够则优先让买包子的买。爱睡懒觉的小明总是来得较晚所以他想知道他如果他来买早饭大概需要排多久的队伍,好知道会不会迟到。

             假设食堂只有一个窗口,从6.30开始供应,初始蛋饼有10个,包子无限量,大厨每隔10分钟可以做出10个蛋饼,因为蛋饼畅销所以大厨一直在做,若供应量够则每个学生需要花费1分钟来完成购买。我们已知今天买早饭的N个学生来的时间ti和买早饭的种类ki(1表示蛋饼,2表示包子)以及数量si(每个学生只卖一种不会同时买包子和蛋饼),现在给出小明来买早饭的时间,种类和数量,请帮忙计算需要排多久的队伍

    Input

    多组测试数据

    第一行包括买早饭的人的数量n(1<=n<=180) 接下来有n行,每行三个数据ti(06:00<=ti<=09:00),ki(1或2),si(1<=si<=100)分别表示来买的人时间种类以及数量,最后一行则表示来的是小明(保证时间没有重复)

    Output

      输出小明买好早饭的时间,格式参照输入时间

    Sample Input

    5
    06:30  1  2
    06:32  2  4
    06:31  1  3
    06:33  1  5
    06:34  1  1

    Sample Output

    06:41
     
     
    解析:可以利用结构体存储每一个人的信息,其中利用一个xm来标记是否是小明,然后我们将时分全部转为分钟来记录每一个分钟点,然后暴力模拟每一个分钟即可,每次判断(t-390)%10,==0表示六点半过每10分钟,蛋饼数量+10,如果蛋饼数量不够,需要后面买包子来填充,因此结构体中还需要设个 f 来标记此人是否已经买过,不然轮到他的时候就重复计算了🍕。
     
    注意点:
    1. 时间数据范围06:00<=ti<=09:00,蛋饼是6:30才开始,所以之前蛋饼个数是0,六点半之前需要蛋饼的同学需要一直等到六点半。
    2.输入到来时间不一定有序,需要自己重新排序
    1. #include
    2. #include
    3. using namespace std;
    4. struct s
    5. {
    6. int t,k,g,f,xm;//t表示到来时刻,k买的种类,g个数,f是否购买过,xm是否是小明
    7. bool operator<(const s&x)const{
    8. return t//按照来的时刻从早到晚排序
    9. }
    10. }a[185];
    11. int main()
    12. {
    13. int n,i,d,t,j,s,h,m;
    14. while(~scanf("%d",&n)){
    15. t=390,d=10;//6:30看成第390分钟,初始蛋饼有10个
    16. //输入每一个人的信息
    17. for(i=0;iscanf("%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;
    18. a[n-1].xm=1,i=0;
    19. //第n-1个就是小明,标记一下
    20. sort(a,a+n);
    21. while(1){
    22. s=0;//标记该时刻有无同学购买
    23. while(a[i].f==1) i++;//找到队伍下一个没买过的人
    24. if(t>=a[i].t){//表示这个人已经到达食堂
    25. if(a[i].k==1){//买的是蛋饼
    26. if(a[i].g<=d){//判断蛋饼个数是否足够
    27. t++,d-=a[i].g,s=1,a[i].f=1;
    28. //时间++,蛋饼对应减少,s=1表示有人购买,a[i].f标记此人已经购买
    29. if((t-390)%10==0) d+=10;//因为起点是六点半,所以要减掉390
    30. if(a[i].xm==1){//如果是小明,输出直接退出
    31. printf("%02d:%02d\n",t/60,t%60);
    32. goto out;
    33. }
    34. i++;
    35. }else{//蛋饼数量不够,需要找后面排队的包子人
    36. for(j=i+1;j
    37. if(t>=a[j].t&&a[j].k==2&&a[j].f==0){//满足条件
    38. a[j].f=1,t++,s=1;
    39. if((t-390)%10==0) d+=10;//时辰已到,蛋饼+10
    40. if(a[j].xm==1){
    41. printf("%02d:%02d\n",t/60,t%60);
    42. goto out;
    43. }
    44. break;
    45. }
    46. }
    47. }
    48. }else{//购买的是包子
    49. t++,a[i].f=1,s=1;
    50. if((t-390)%10==0) d+=10;
    51. if(a[i].xm==1){
    52. printf("%02d:%02d\n",t/60,t%60);
    53. goto out;
    54. }
    55. i++;
    56. }
    57. }
    58. if(s==0){//该时间点无人购买
    59. t++;
    60. if((t-390)%10==0) d+=10;
    61. }
    62. }
    63. out:;
    64. }
    65. return 0;
    66. }

  • 相关阅读:
    MongoDB
    【2022牛客多校-8】D - Poker Game: Decision
    内核态和用户态
    Zabbix技术分享——使用Zabbix监控系统日志文件大小
    代码随想录算法训练营Day60|单调栈01
    SpringBoot框架下——设置字符编码——2种实现方式
    nodejs+python教学成果投票系统java
    交通流的微观模型(Matlab代码实现)
    USB设备枚举
    FPGA SERDESE2 (SDR收发仿真)
  • 原文地址:https://blog.csdn.net/qq_63739337/article/details/126417319