问题描述
分析
- 拿到问题的时候时间比较仓促,估计题目原来的考点和意思就是想用队列表示。自己感觉又有那么一点生产者和消费者问题的意思。
- 要求用C语言编写,但是自己对C语言的线程不是很感冒,所用还是用了常规的方法将这道题给做了,时间仓促,后来又不想改了,如有错误的地方,欢迎大家批评指正。
具体实现
- 因为程序每次运行时的随机数是不变的,所以人数的190是我跑了一次才得出的,如果想一次就得出结果的话,可以自己设置一个计数器,同时需要一个变量记录总时间(可能会超出int),最后再来算平均时间。
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main(){
int cost[300];
int AllTime = 0;
cost[0]=0;
for(int i=1;i<300 && AllTime<=7200;i++)
{
cost[i] = cost[i-1]+rand()%(35 - 25 + 1) + 25;
AllTime =cost[i];
}
int window_1[200];
int window_2[200];
int a_head=0;
int a_tail=0;
int a_waitTime=0;
int a_serverTime=0;
int b_head=0;
int b_tail=0;
int b_waitTime=0;
int b_serverTime=0;
int i=0;
int withoutServer=0;
int maxServer =0;
int maxWaitServer=0;
int minServer =130;
int minWaitServer=7200;
int temp2=0;
int costNum=0;
float averageServerTime=0;
for(int j=0;j<=7200;j++)
{
if(j==cost[i])
{
temp2=rand()%((130)-(20)+1)+20;
if(temp2>maxServer) maxServer = temp2;
if(temp2<minServer) minServer= temp2;
if(((a_tail-a_head)<(b_tail-b_head))||((a_tail-a_head)==(b_tail-b_head)))
{
if((a_waitTime+temp2)<(7200-j))
{
window_1[a_tail]=temp2;
a_waitTime+=temp2;
if(a_waitTime>maxWaitServer)
{
maxWaitServer = a_waitTime;
}
if(a_waitTime<minWaitServer)
{
minWaitServer = a_waitTime;
}
a_tail+=1;
costNum+=1;
averageServerTime+=(1.0*a_waitTime/190);
cout<<"第"<<j<<"秒,第"<<i<<"位客人来到"<<"窗口一,"<<"需要服务时间"<<temp2<<",一共服务时间"<<a_waitTime<<",前面有"<<a_tail-a_head-1<<"位人等待"<<endl;
}
else
{
withoutServer +=1;
}
}
else
{
if((b_waitTime+temp2)<(7200-j))
{
window_2[b_tail]=temp2;
b_waitTime+=temp2;
if(b_waitTime>maxWaitServer)
{
maxWaitServer = b_waitTime;
}
if(b_waitTime<minWaitServer)
{
minWaitServer = b_waitTime;
}
b_tail+=1;
costNum+=1;
averageServerTime+=(1.0*b_waitTime/190);
cout<<"第"<<j<<"秒,第"<<i<<"位客人来到"<<"窗口二,"<<"需要服务时间"<<temp2<<",一共服务时间"<<b_waitTime<<",前面有"<<b_tail-b_head-1<<"位人等待"<<endl;
}
else
{
withoutServer +=1;
}
}
i+=1;
}
if(window_1[a_head]==0)
{
if((a_head+1<a_tail)||(a_head+1==a_tail))
{
a_head+=1;
}
}
else
{
window_1[a_head]-=1;
if(a_waitTime>0)
{
a_waitTime-=1;
}
}
if(window_2[b_head]==0)
{
if((b_head+1<b_tail)||(b_head+1==b_tail))
{
b_head+=1;
}
}
else
{
window_2[b_head]-=1;
if(b_waitTime>0)
{
b_waitTime-=1;
}
}
}
cout<<"最大服务时长:"<<maxServer<<"最小服务时长"<<minServer<<endl;
cout<<"最大服务时长(含等待时间)"<<maxWaitServer<<"最小服务时长(含等待时间)"<<minWaitServer<<endl;
cout<<"服务客人数:"<<costNum<<endl;
cout<<"平均服务时间(含等待时间)"<<averageServerTime<<endl;
cout<<"未服务的人数:"<<withoutServer<<endl;
cout<<"程序正常退出。";
return 0;
}