• PAT1017


    题目链接: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 }
  • 相关阅读:
    线程练习-网络买票
    永久储存信息(已完善)
    Linux命令
    oracle(3)
    小结
    java开发中中文编码问题
    double保留两位小数
    oracle(2)
    javadate相关
    分布式
  • 原文地址:https://www.cnblogs.com/bochen-sam/p/3353531.html
Copyright © 2020-2023  润新知