在这里首先写一下我的感想。这道题和生活联系密切,一拿到这道题我一开始也没思路,后来参考了一切其他人的想法,马上就有思路了,这里队列的参数为每个人的离开时间,随之按照情况模拟就可以了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,n,x,y;
cin>>t;
while(t--)
{
int sum=0; //sum为总的逗留时间
int time1=0; //time1,time2为每一个人的离开时间(注意这个离开时间是0到360的时间,这个时间将要进队列)
int time2=0;
queue<int>q1;
queue<int>q2; //声明两个队列,分别为1和2号窗口每个人的离开时间的队列
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x>>y;
while(!q1.empty()&&q1.front()<=x) //只要队列不空并且前面的人的离开时间小于现在的时间了,他肯定要出列,也就是离开了;
q1.pop();
while(!q2.empty()&&q2.front()<=x) //与上面同理
q2.pop();
if(q1.size()<=q2.size()) //题目要求,要认真读题
{
if(q1.empty()) //如果1号窗口空
{
sum=sum+y; //逗留时间为已有的逗留时间加上办业务所需要的时间,无需等待
time1=x+y; //离开时间,为现在的时间加上办理业务所需要的时间(注意前提条件,这里是队列为空),此时间即为将要进队列的时间
}
else
{
sum=sum+y+time1-x; //如果队列有人,逗留时间更新为已有逗留时间加上自身逗留时间加上自身需要等待的时间(前一个人的离开时间减去当前时间)
time1=time1+y; //离开时间更新为上一个人的离开时间加上自身逗留时间
}
q1.push(time1); //将该人的离开时间进队列;
}
else //另一种情况就不再赘述,弄懂一种另一种迎刃而解
{
if(q2.empty())
{
sum=sum+y;
time2=x+y;
}
else
{
sum=sum+y+time2-x;
time2=time2+y;
}
q2.push(time2);
}
}
cout<<fixed<<setprecision(2)<<sum*1.0/n<<endl;
}
return 0;
}