这道题目是一道模拟题目,题目意思是有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\n",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\n",sum); printf("before %d:%d:%d\n",last[index].hh,last[index].mm,last[index].ss); add(last[index],record[i].lapse); printf("after %d:%d:%d\n",last[index].hh,last[index].mm,last[index].ss); for(int j=0;j<k;j++) { printf("%d %d %d\n",last[j].hh,last[j].mm,last[j].ss); } printf("====\n"); } //printf("%d\n",sum); printf("%0.1lf\n",sum/((num)*1.0*60)); } return 0; }
时间: 2024-11-09 07:28:36