PAT-1017 Queueing at Bank (25)

   这道题目是一道模拟题目,题目意思是有n个串口,和一串顾客到达的时间,顾客按先来先服务方式排队,问你这些顾客的平均等待时间是多少?实现:首先把顾客到达顺序记录下来,然后依据到达时间进行排序,k个窗口维护一个数据结构,就是服务的结束时间last,刚开始用end变量,发现提交的时候报错了,估计是系统保留的关键字。每一次从记录里面拿一个人,遍历k个窗口,查看谁的结束时间最早,然后把这个顾客加到这个窗口上,更新结束时间。如此知道最后,分享一下我的测试数据:

7 3
07:55:00 16
17:00:01 2
07:59:59 15
08:01:00 60
08:00:00 30
08:00:02 2
08:03:00 10
4 3
07:55:00 5
07:56:00 30
08:00:00 35
17:00:00 20

 这里注意一点就是你的窗口最后结束时间,可能小于顾客到达时间的情况,那么顾客无需等待,窗口的last也应该更新为新的到达时间,而不是上一次的结束时间,这个小bug解决了,就全部A过了。

#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

struct Record
{
       int hh;
       int mm;
       int ss;
       int lapse;
       bool operator<(const Record & a) const//Struct 小于操作重载时候需加上const 
       {
            if(hh<a.hh)
               return true;
            else if(hh==a.hh)
            {
               if(mm<=a.mm)
                 return true;
                else if(mm==a.mm)
                {
                     if(ss<=a.ss)
                       return true;
                }
            }
            return false;
       }
};
void add(Record & a,int mm)
{
     a.mm+=mm;
     if(a.mm>=60)
     {
        a.mm%=60;
        a.hh++;
     }
}
int sub(const Record & a,const Record & b)
{
    int sum=0;
    int ss=a.ss,mm=a.mm,hh=a.hh;
    bool jie=false;
    if(ss<b.ss)
    {
     ss=ss+60;
     jie=true;
     }
              sum=ss-b.ss;
              if(jie)
              {
                 mm-=1;
                 jie=false;
              }
              if(mm<b.mm)
              {
                 mm+=60;
                 jie=true;
              }
              sum+=(mm-b.mm)*60;
              if(jie)
              {
                 hh-=1;
                 jie=false;
              }
              sum+=(hh-b.hh)*60*60;
              return sum;
}

Record record[10010];
Record last[110];

int selectWind(int k)
{
    int minIndex=0;
    Record min=last[0];
    for(int i=1;i<k;i++)
    { 
       if(last[i]<min)
       {
          minIndex=i;
          min=last[i];
       }
    }
    return minIndex;
}

void parse(string time,int &hh,int &mm,int &ss)
{
   int a,b;
   for(int i=0;i<time.length();i++)
   {
      a=time[i]-'0';
      b=time[i+1]-'0';
      switch(i/3+1)
      {
        case 1:
           hh=a*10+b;
           break;
        case 2:
           mm=a*10+b;
           break;
        case 3:
           ss=a*10+b;
           break;
      }
      i++;
      i++;
   }
}

bool cmp(const Record & a,const Record & b)
{
  if(a.hh<b.hh)
     return true;
  else if(a.hh==b.hh)
  {
       if(a.mm<b.mm)
          return true;
       else if(a.mm==b.mm)
       {
            if(a.ss<b.ss)
               return true;
       }
  }
  return false;
}

int main()
{
    int n,k;
    string time;
    int lapse;
    int hh,mm,ss;
    freopen("1017-in.txt","r",stdin);
    freopen("1017-out.txt","w",stdout);
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        int count=0;
        for(int i=0;i<n;i++)
        {
           cin>>time>>lapse;
           parse(time,hh,mm,ss);
           if(hh>17||(hh==17&&(mm>0||ss>0)))
           {
               count++;
               continue;
           }
           record[i-count].hh=hh;
           record[i-count].mm=mm;
           record[i-count].ss=ss;
           record[i-count].lapse=lapse;
        }
        sort(record,record+n-count,cmp);
        /*for(int i=0;i<n-count;i++)
        {
           printf("%02d:%02d:%02d %d
",record[i].hh,record[i].mm,record[i].ss,record[i].lapse);
        }*/
        int num=n-count;
        int index=0;
        for(int i=0;i<k;i++)
        {
           last[i].hh=8;
           last[i].mm=0;
           last[i].ss=0;
        }
        int sum=0;
        for(int i=0;i<num;i++)
        {
           index=selectWind(k);
           if(last[index]<record[i])
               last[index]=record[i];
           else
               
           sum+=sub(last[index],record[i]);
           //printf("%d
",sum);
           printf("before %d:%d:%d
",last[index].hh,last[index].mm,last[index].ss);
           add(last[index],record[i].lapse);
           printf("after %d:%d:%d
",last[index].hh,last[index].mm,last[index].ss);
           for(int j=0;j<k;j++)
           {
             printf("%d %d %d
",last[j].hh,last[j].mm,last[j].ss);
           }
           printf("====
");
        }
        //printf("%d
",sum);
        printf("%0.1lf
",sum/((num)*1.0*60));
        
    }
    return 0;
}
原文地址:https://www.cnblogs.com/championlai/p/3987987.html