银行排队问题

酒红色酸奶 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);
}
...全文
352 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-06-12
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个? 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧