题目:ios
假设银行有K个窗口提供服务,窗口前设一条黄线,全部顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客老是选择编号最小的窗口。ide
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,而且统计每一个窗口服务了多少名顾客。spa
输入格式:code
输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,而且假设输入数据已经按到达时间前后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。这里假设每位顾客事务被处理的最长时间为60分钟。blog
输出格式:事务
在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。it
在第二行中按编号递增顺序输出每一个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。io
思路:ast
设两个结构体分别表示窗口和客户。每一个窗口有他的服务人数和处理完当前客户后的结束时间。两重循环每一个客户遍历全部的窗口,分等待和不等两种状况讨论。class
代码:


#include <iostream> #include <stdio.h> #include <malloc.h> #define inf -1e9 #define FRE() freopen("in.txt","r",stdin) using namespace std; const int maxn = 1010; struct Windows { int num_people; int endTime; Windows() { num_people = 0, endTime = 0; } } w[15]; struct People { int arrive; int wait; int keep; } peo[maxn]; int N,K,l,r; void init() { l = 0,r = 0; scanf("%d",&N); for(int i = 0; i<N; i++) { scanf("%d%d",&peo[r].arrive,&peo[r].keep); if(peo[r].keep>60) peo[r].keep = 60; peo[r].wait = 0; r++; } scanf("%d",&K); for(int i = 0; i<K; i++) { w[i].endTime = 0; w[i].num_people = 0; } } void check() { for(int i = 0; i<N; i++) { printf("%d ",peo[i].keep); } printf("\n"); } int main() { // FRE(); int maxWite = 0,sumWite = 0,lastFinish = 0; init(); while(l<r) { bool isWait = true; int index = -1,minEnd = 1e9; for(int i = 0; i<K; i++) { if(peo[l].arrive>=w[i].endTime)//不须要等待 { w[i].endTime = peo[l].arrive+peo[l].keep;//更新该窗口的结束时间 w[i].num_people++;//更新该窗口的服务人数 isWait = false;//标记一下该客户不须要等待 break; } else //须要等待 { if(minEnd > w[i].endTime)//找到结束时间最近的窗口 { minEnd = w[i].endTime;//更新最近的结束时间 index = i;//记录这个窗口的下标 } } } if(isWait) { peo[l].wait += w[index].endTime-peo[l].arrive;//更新客户的等待时间 sumWite += w[index].endTime-peo[l].arrive;//求全部客户的等待时间的总和 maxWite = max(maxWite, w[index].endTime-peo[l].arrive);//更新最大的等待时间 w[index].endTime += peo[l].keep;//更新该窗口的结束时间 w[index].num_people++;//更新该窗口的服务人数 } l++; } //check(); for(int i = 0; i<K; i++) { if(w[i].endTime>lastFinish) lastFinish = w[i].endTime; } printf("%.1f %d %d\n",sumWite*1.0/N, maxWite, lastFinish); for(int i = 0; i<K; i++) { if(i!=0) printf(" "); printf("%d",w[i].num_people); } return 0; } /* 9 0 20 1 15 1 61 2 10 10 5 10 3 30 18 31 25 31 2 3 */ /* 6.2 17 61 5 3 1 */