本专栏持续输出数据结构题目集,欢迎订阅。
题目
一般机场里,航班到达后,旅客们会去到达区的行李传送带那里取自己的行李。
现假设有一座特别的机场,每条传送带只有一个取行李的窗口。旅客们必须排好队,逐一到窗口取自己的行李。但是当某人到窗口前,发现行李不是自己的,那人就只好走到队尾去等下一次机会。此时那件行李会一直等在窗口,直到它的主人把它取走。假设每一次认领需要 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(≤10^3)。下一行给出 N 个数字,是 [1,N] 区间内整数的一个重排列,表示旅客队列。这里我们假设行李队列是按 1、2、……、N 有序的,并且行李 i 属于旅客 i。一行中数字间以空格分隔。
输出格式:
在一行中输出传送带清空需要的时间、以及旅客们的平均等待时间(输出小数点后 1 位)。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
5
3 5 1 2 4
输出样例:
9 6.0
题目引用自攀拓考试真题(2022年冬季)。
代码
#include <stdio.h>
#include <stdlib.h>
// 定义队列结构
typedef struct Queue {
int *data;
int front;
int rear;
int size;
int capacity;
} Queue;
// 创建队列
Queue* createQueue(int capacity) {
Queue *q = (Queue*)malloc(sizeof(Queue));
q->capacity = capacity;
q->front = 0;
q->rear = -1;
q->size = 0;
q->data = (int*)malloc(sizeof(int) * capacity);
return q;
}
// 入队操作
void enqueue(Queue *q, int value) {
q->rear = (q->rear + 1) % q->capacity;
q->data[q->rear] = value;
q->size++;
}
// 出队操作
int dequeue(Queue *q) {
int value = q->data[q->front];
q->front = (q->front + 1) % q->capacity;
q->size--;
return value;
}
int main() {
int N;
scanf("%d", &N);
Queue *passengers = createQueue(N);
for (int i = 0; i < N; i++) {
int p;
scanf("%d", &p);
enqueue(passengers, p);
}
int current_bag = 1; // 当前窗口的行李
int time = 0; // 总耗时
int *wait_time = (int*)malloc(sizeof(int) * (N + 1)); // 索引1~N对应旅客1~N
while (current_bag <= N) {
time++; // 每次操作耗时1分钟
int passenger = dequeue(passengers); // 取出队首旅客
if (passenger == current_bag) {
// 旅客取走行李
wait_time[passenger] = time;
current_bag++; // 下一个行李准备好
} else {
// 旅客回到队尾
enqueue(passengers, passenger);
}
}
// 计算平均等待时间
double total_wait = 0;
for (int i = 1; i <= N; i++) {
total_wait += wait_time[i];
}
double avg_wait = total_wait / N;
// 输出结果
printf("%d %.1f\n", time, avg_wait);
return 0;
}
1370

被折叠的 条评论
为什么被折叠?



