一般机场里,航班到达后,旅客们会去到达区的行李传送带那里取自己的行李。
现假设有一座特别的机场,每条传送带只有一个取行李的窗口。旅客们必须排好队,逐一到窗口取自己的行李。但是当某人到窗口前,发现行李不是自己的,那人就只好走到队尾去等下一次机会。此时那件行李会一直等在窗口,直到它的主人把它取走。假设每一次认领需要 1 分钟,本题就要求你计算传送带清空需要的时间、以及旅客们的平均等待时间。
例如,假设行李 i 属于旅客 i。行李的到达顺序是 1、2、3,旅客的到达顺序是 2、1、3。则 1 号行李要等 2 分钟才能被主人 1 号旅客取走。这时行李队列中有 2、3,旅客队列中是 3、2。于是 2 号行李还要等 2 分钟才能被 2 号旅客取走,最后 3 号在第 5 分钟取走行李。旅客们的平均等待时间是 (2+4+5)/3≈3.7。
输入格式:
输入首先在第一行给出一个正整数 N(≤103)。下一行给出 N 个数字,是 [1,N] 区间内整数的一个重排列,表示旅客队列。这里我们假设行李队列是按 1、2、……、N 有序的,并且行李 i 属于旅客 i。一行中数字间以空格分隔。
输出格式:
在一行中输出传送带清空需要的时间、以及旅客们的平均等待时间(输出小数点后 1 位)。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
5
3 5 1 2 4
输出样例:
9 6.0
题目引用自攀拓考试真题(2022年冬季)。
满分代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[1000][2];
int sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i][0]);
a[i][1]=0;
}
int x=-1;
int y=0;
for(int i=1;i<=n;i++){
while(x++>-2){
if(x>=n){
x=0;
}
if(a[x][1]==-1){
continue;
}else{
y++;
if(a[x][0]==i){
sum+=y;
a[x][1]=-1;
break;
}
}
}
}
printf("%d %.1lf",y,sum*1.0/n);
}