用时间轴模拟做这道题
#include<bits/stdc++.h>
using namespace std;
struct win
{
int ptime; //窗口所在人的剩余时间
int guknum; //窗口处理人数
win(){}
};
win w[10];
struct People
{
int atime; //到达时间
int ptime; //处理时间
int wtime; //等待时间
People (){}
People (int a,int b,int c):atime(a),ptime(b),wtime(0){}
};
People peo[1009];
int main()
{
int n,k,leftp=0;//leftp为出队的人的个数
scanf("%d",&n);
queue<People>p;
int a,b;
for (int j=0;j<n;j++)
{
scanf("%d%d",&a,&b);
if (b>60)
b=60; //超过六十按六十计算
peo[j].wtime=0;
peo[j].atime=a;
peo[j].ptime=b;
p.push(People(a,b,0));
}
scanf("%d",&k);
for (int i=0;i<k;i++)
{
w[i].guknum=0;
w[i].ptime=0;
}
int i;
for (i=0;;i++) //每一秒
{
while (!p.empty()) //循环使尽可能多的人出来
{
int flag=-1;
for (int j=0;j<k;j++)
{
if (w[j].ptime==0) //找到第一个空窗口
{
flag=j;
break;
}
}
if (flag==-1)
{
break; //如果没有就不再选人
}
else
{
People tmp=p.front(); //有空闲窗口
if (tmp.atime<=i) //有人
{
leftp++;
p.pop();
w[flag].guknum++;
w[flag].ptime=tmp.ptime;
}
else
break;
}
}
for (int j=0;j<k;j++)
{
if (w[j].ptime!=0) //更新每一个窗口
{
w[j].ptime--;
}
}
for (int j=leftp;j<n;j++)
{
if (peo[j].atime<=i) //已经在的人,等待时间加1
peo[j].wtime++;
}
if (p.empty()) //如果人走完了,直接退出循环
break;
}
int sum=0,maxn=-1,maxn1=-1;
for (int j=0;j<k;j++)
{
maxn1=max(maxn1,w[j].ptime); //人走完后的窗口最大处理时间
}
for (int j=0;j<n;j++)
{
sum+=peo[j].wtime; //总的等待时间
maxn=max(maxn,peo[j].wtime);//最长等待时间
}
printf("%.1lf %d %d\n",sum*1.0/n,maxn,i+1+maxn1);//由于存在0,所以为队空时间+1+人走完后的窗口最大处理时间
//cout<<"i=="<<i<<endl;
for (int j=0;j<k;j++)
{
if (j==0)
printf("%d",w[j].guknum);
else
{
printf(" %d",w[j].guknum);
}
}
printf("\n");
return 0;
}