~题目链接~
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2087&cid=1182
输入
1 1 60 10
结果
10.00
就是用 对列模拟
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--){
//模拟窗口
queue<int >Q;
queue<int >P;
int n,x,y,q=0,p=0,time=0;//q、p分别记录队列Q、P中最后一位的离开时间,time总时间统计
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d%d",&x,&y);
//判断离开
while(!Q.empty()){
if(Q.front()>x)
break;
Q.pop();
}
while(!P.empty()){
if(P.front()>x)
break;
P.pop();
}
//入队
if(Q.size()<=P.size()){
//离开时间更新
if(q>=x)
q+=y;
else
q=x+y;
//入站
Q.push(q);
time+=q-x;
}
else{
if(p>=x)
p+=y;
else
p=x+y;
P.push(p);
time+=p-x;
}
}
double ave=1.0*time/n;
printf("%.2lf\n",ave);
}
return 0;
}