#include <iostream>
#include <queue>
using namespace std;
typedef struct
{
int arrival,need;
}client;
int main()
{
queue <client> q;
int n;
cin>>n;
int time=0,ans=0;
for(int i=0;i<n;i++)
{
client t;
cin>>t.arrival>>t.need;
if (q.empty())
{
if(time>t.arrival) //前面只有一个人正在弄,但要等
{
ans+=time-t.arrival;
time+=t.need;
}
else
time=t.arrival+t.need;
}
else if (t.arrival<time)//提前到了,但是还在弄
{
q.push(t);
int e=q.front().need;
q.pop();
ans+=t.arrival-time+e;
}
}
printf("%.2f",ans*1.0/n);
}
法二
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int QElemType;
#define MAXQSIZE 100 // 最大队列长度(对于循环队列,最大队列长度要减1)
typedef struct
{
QElemType *base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
Status InitQueue(SqQueue &Q)
{
// 构造一个空队列Q,该队列预定义大小为MAXQSIZE
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) exit(1);
Q.rear=Q.front=0;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e)
{
// 插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q, QElemType &e)
{
// 若队列不空, 则删除Q的队头元素, 用e返回其值, 并返回OK; 否则返回ERROR
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
Status GetHead(SqQueue Q, QElemType &e)
{
// 若队列不空,则用e返回队头元素,并返回OK,否则返回ERROR
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
return OK;
}
int QueueLength(SqQueue Q)
{
// 返回Q的元素个数
return Q.rear%MAXQSIZE-Q.front%MAXQSIZE;
}
int main()
{
int n;
cin>>n;
SqQueue Q;
InitQueue(Q);
int time=0;//前一个人弄完的时间
double ans=0;
int e;
for(int i=0;i<n;i++)
{
int arrival,need;
cin>>arrival>>need;
if(Q.front==Q.rear )
{
if(time>arrival) //前面只有一个人正在弄,但要等
{
ans+=time-arrival;
time+=need;
}
else
time=arrival+need;
}
else if (arrival<time)//提前到了,但是还在弄
{
EnQueue(Q,need);
DeQueue(Q, e);
ans+=arrival-time+e;
}
}
printf("%.2f",ans/n);
}