PAT1017

本文提供了一种解决 PAT-A-1017 问题的方法,通过模拟银行窗口的服务流程来计算客户的平均等待时间。关键在于正确处理时间转换和比较,确保每个到达的客户都能在规定的条件下被妥善服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1017

主要思想,是秒数为时钟,判断每一秒种的动作,是否有客户需要处理业务等等,有2点注意下:1,每个客户处理业务时间不能超过一个小时。2,每个在17点前到达的客户都能得到业务办理,即使银行到了关门时间。剩下的就剩模拟了,我的代码中 主要用了一个函数来算2个时间之间所差的秒数。

 

  1 #include<iostream>
  2 #include<string>
  3 #include<vector>
  4 #include<queue>
  5 #include<algorithm>
  6 #include<iomanip>
  7 using namespace std;
  8 
  9 int date2second(string end, string start)
 10 {
 11     int hh(0), mm(0), ss(0);
 12     for(int i=0; i<3; ++i)
 13          if(i == 0)     
 14          { 
 15              ss = (end[6]-start[6])*10 + (end[7]-start[7]);
 16              if(ss < 0 )
 17              {--mm; ss +=60;}
 18          }
 19          else if(i == 1)
 20          {
 21              mm += (end[3]-start[3])*10 + (end[4]-start[4]);
 22              if(mm < 0)
 23                  {--hh; mm+=60;}        
 24          }
 25          else
 26              hh +=  (end[0]-start[0])*10 + (end[1]-start[1]);
 27     int sec = hh*3600+mm*60+ss;
 28     return sec;
 29     /*两个时间点之间差的时间, 用秒数表示返回*/
 30 }
 31 
 32 struct Node
 33 {
 34     int arrives;
 35     int procs;
 36     int waits;
 37 };
 38 /*用秒数老表示时间*/
 39 
 40 bool comp(Node n1, Node n2)
 41 {
 42     if(n1.arrives < n2.arrives)
 43         return true;
 44     else
 45         return false;
 46 }
 47 
 48 int main()
 49 {
 50     int n ,k;
 51     while(cin>>n>>k)
 52     {
 53         if(n == 0 || k == 0)
 54             continue;
 55         vector<queue<Node>> windows(k);
 56         vector<Node> customers;
 57         for(int i=0; i<n; ++i)
 58         {
 59             string atm; int ptm;
 60             cin>>atm>>ptm;
 61             if(atm < "17:00:01")
 62             {
 63                 if(ptm > 60)
 64                     ptm = 60;
 65                 Node n = {date2second(atm, "08:00:00"), ptm*60, 0};
 66                 customers.push_back(n);
 67             }
 68         }
 69         if(customers.empty())
 70             continue;
 71         sort(customers.begin(), customers.end(), comp);
 72         /*排序,保证客户到达顺序的时间连续性*/
 73         queue<Node> cusline;
 74         for(int i=0; i<customers.size(); ++i)
 75             cusline.push(customers[i]);
 76         double num(0);
 77         /*记录有多少客户已经开始或者完成业务*/
 78         int time(0);
 79         /*时钟,以秒为单位*/
 80         double sumtime(0);
 81         /*记录等待时间总和*/
 82         while( !cusline.empty())
 83         {
 84             for(int i=0; i<windows.size(); ++i)
 85                 if(windows[i].empty() && !cusline.empty())
 86                     if(cusline.front().arrives <= time)
 87                     {
 88                         cusline.front().waits = time - cusline.front().arrives;
 89                         sumtime += cusline.front().waits;
 90                         ++num;
 91                         windows[i].push(cusline.front());
 92                         cusline.pop();
 93                     }
 94             /*若窗口空闲且有等待客户,则客户进入*/
 95             ++time;
 96             for(int i=0; i<windows.size(); ++i)
 97                 if(!windows[i].empty())
 98                     if(--windows[i].front().procs == 0)
 99                         windows[i].pop();
100             /*处理每个窗口*/
101         }
102         cout<<fixed<<setprecision(1)<<sumtime/60/num<<endl;
103     }
104     return 0;
105 }

 

转载于:https://www.cnblogs.com/bochen-sam/p/3353531.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值