银行排队问题
酒红色酸奶 2017-06-12 08:47:48 下面是银行排队问题
为什么在PTA中提交时说段错误。
#include <iostream>
#include <cstdio>
using namespace std;
#define MaxSize 1100
struct information //定义每个顾客的信息的结构体
{
int time; //顾客到达的时间
int need; //顾客所需要的服务时间
int wait; //顾客的等待时间
}mem[1100];
struct qq //定义队列
{
struct information data[MaxSize];
int rear;
int front;
int need_time; //该窗口所有顾客处理完还需要多少时间
int fronttime; //该窗口在被服务的顾客还需要多少时间
}queue[11];
void add(int count,struct information item) //加入队列
{
if((queue[count].rear+1)%MaxSize==queue[count].front)
{
printf("最多只有1000名顾客!");
return;
}
queue[count].data[queue[count].rear]=item;
queue[count].rear=(queue[count].rear+1)%MaxSize;
return;
}
int judge(int count) //判断该窗口是否有人
{
if(queue[count].front==queue[count].rear)
return 1;
else
return 0;
}
void deleteq(int count) //该窗口当前顾客离开
{
queue[count].front=(queue[count].front+1)%MaxSize;
}
int main()
{
int n,count,maxwait=0,all_time=0,allwait=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&mem[i].time,&mem[i].need);
if(mem[i].need>60)
mem[i].need=60;
}
scanf("%d",&count);
int now=0,last=0; //now为已经排队的人数 last为已经办完事的人数
while(last<n) //等到所有人都离开了才结束
{
for(int i=now;i<n;i++)
{
if(mem[i].time==all_time) //如果到了该顾客到达的时间
{
int min=60,flag=-1;
for(int j=0;j<count;j++) //寻找当前在队伍中的顾客处理完时间最少的队伍
{
if(queue[j].need_time<min)
{
min=queue[j].need_time;
flag=j;
}
}
queue[flag].need_time+=mem[i].need; //该队当前加入该顾客后处理完需要多少时间
if(judge(flag)==1)
queue[flag].fronttime=mem[i].need; //如果队伍是空的,那该队当前顾客还需要的时间
add(flag,mem[i]); //该顾客加入还需要时间最少的队伍
now++;
}
}
all_time++; //每次进入循环时间加1
for(int p=0;p<count;p++)
{
for(int a=queue[p].front+1;a<=queue[p].rear;a++) //队伍中除了已经在处理的顾客其他等待时间都加1
queue[p].data[a].wait++;
if(judge(p)==0) //如果队伍里有人排队 则该队伍处理完的时间-1
{ //在处理的顾客还需要的时间-1
queue[p].need_time--;
queue[p].fronttime--;
if(queue[p].fronttime==0) //如果当前顾客处理完了 就离开队伍
{
deleteq(p); //下一名顾客处理
queue[p].fronttime=queue[p].data[queue[p].front].need; //则修改第一位顾客的处理时间
last++; //处理完的顾客+1
}
}
}
}
for(int r=0;r<count;r++)
for(int k=0;k<queue[r].rear;k++) //遍历每只队伍中的顾客等待的时间
{
allwait+=queue[r].data[k].wait;
if(queue[r].data[k].wait>maxwait)
maxwait=queue[r].data[k].wait;
}
printf("%.1lf %d %d\n",allwait*1.0/n,maxwait,all_time);
for(int y=0;y<count-1;y++)
printf("%d ",queue[y].rear);
printf("%d",queue[count-1].rear);
}