描述
丁爸信奥培训中心最近在浙江中小企业大厦租了一层楼,这层楼的形状如下:
由图可见,这层楼中间是走廊,两侧各有 200 个房间,编号如上图。
最近,丁爸信奥培训中心做了内部机构的调整,需要把一些桌子从一个房间搬到另外的房间。因为走廊很窄,但是桌子很大,所以同一段走廊每次只能通过一个桌子。
假设不论远近,每趟搬桌子都需要 10 分钟。同时,当你从房间 i 搬桌子到房间 j 的过程中,房间 i 到房间 j 之间的走廊都被占用,也就是说,在每个 10 分钟内,不能有多个任务共享同一段走廊。
现在,丁爸想知道:要完成所有的搬运任务,最少需要多少时间?
输入
输入包含 C 组测试数据。
每组测试数据首先是一个正整数 N(1 <= N <= 200),表示需要搬运的桌子数量。
接下来 N 行,每行包含 2 个正整数 s 和 t,表示需要将一个桌子从房间 s 搬到房间 t。
输出
计算并输出完成所有的搬运任务需要的最少的时间,每组数据占一行。
输入样例 1
3 4 10 20 30 40 50 60 70 80 2 1 3 2 200 3 10 100 20 80 30 50
输出样例 1
10 20 30
#include <stdio.h>
#include <stdlib.h>
#define MAX_ROOMS 200
int main() {
int C; // 测试数据组数
scanf("%d", &C);
while (C--) {
int N; // 搬运任务数量
scanf("%d", &N);
int corridor[MAX_ROOMS] = {0}; // 初始化走廊占用次数数组
for (int i = 0; i < N; i++) {
int s, t;
scanf("%d %d", &s, &t);
// 确保 s 小于 t
if (s > t) {
int temp = s;
s = t;
t = temp;
}
// 将房间编号转换为走廊段编号(1-200 -> 0-199)
s = (s - 1) / 2;
t = (t - 1) / 2;
// 增加走廊段的占用次数
for (int j = s; j <= t; j++) {
corridor[j]++;
}
}
// 找出最大占用次数
int max_occupancy = 0;
for (int i = 0; i < MAX_ROOMS; i++) {
if (corridor[i] > max_occupancy) {
max_occupancy = corridor[i];
}
}
// 计算最少时间
int min_time = max_occupancy * 10;
printf("%d\n", min_time);
}
return 0;
}