「小 B 的宿舍」
题目描述
小B的宿舍楼沿着走廊南北向的两边各有200 个房间,如下所示:
[房间1][房间3][房间5][房间7][房间9 ]...[房间399]
----------------------------------------------
走廊
----------------------------------------------
[房间2][房间4][房间6][房间8][房间10]...[房间400]
最近,由于转专业和专业分流的原因,宿舍将迎来新的调整,以便组成新的班级后方便管理。
但是由于走廊狭窄,走廊里只能通过两个搬运的物品(可以同向也可以反向),因此必须指定高效的搬运计划。
老师给了每位同学下达了以下要求,让同学们体现收拾好行李,然后给每位同学 1 分钟的时间搬运。
当从房间 i 搬运行李到 j 时,i 与 j 之间的走廊都会被占用,但是可以容纳两个不同同学同时搬运。所以,10 分钟之内同一段走廊最多两个人同时搬运,不重叠的走廊也可以同时搬运。
小B的老师是个数学老师,经过运筹学一通计算他得到了最优的搬运计划。
虽然计划不唯一,但是最优值唯一,请问这个最短时间是多少?
输入描述
输入数据有 T 组测试例,在第一行给出测试例个数 T。
每个测试例的第一行是一个整数 N(1≤N≤200),表示要搬运行李的人数。
接下来 N 行,每行两个正整数 s 和 t,表示一个人,要将行李是从房间 s 移到到房间t。
输出描述
每组输入都有一行输出数据,为一整数 Time,表示完成任务所花费的最小时间。
示例
输入
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
输出:
10
10
20
代码:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class Main2 {
// 输出流,用于输出结果
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
// 输入流,用于读取输入数据
static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception {
// 读取测试用例的数量
int T = Int();
// 对每个测试用例进行处理
while (T-- > 0) {
// 读取当前测试用例中要搬运行李的人数
int N = Int();
// 创建一个数组用于记录每个房间的搬运任务数量
int[] hostels = new int[401];
// 依次处理每个人的搬运任务
for (int i = 1; i <= N; i++) {
// 读取当前人的搬运任务的起始房间和目标房间
int s = Int();
int t = Int();
// 如果目标房间在起始房间之前,则交换两者的值
if(t < s){
int temp = s;
s = t;
t = temp;
}
// 如果起始房间是偶数,则调整为奇数,因为走廊只能从奇数房间搬运
if (s % 2 == 0) {
s = s - 1;
}
// 如果目标房间是奇数,则调整为偶数,因为走廊只能搬运到偶数房间
if (t % 2 != 0) {
t = t + 1;
}
// 对起始房间到目标房间之间的每个房间进行搬运任务数量的增加
for (int j = s; j <= t; j++) {
hostels[j] += 1;
}
}
// 找到搬运任务数量的最大值
int max = 0;
for (int i = 1; i <= 400; i++) {
if (hostels[i] > max) {
max = hostels[i];
}
}
// 计算最短搬运时间并输出结果
int result = max * 10;
pw.println(result);
}
// 输出结果
pw.flush();
}
// 以下是用于读取输入的辅助函数
// 读取一行输入数据
public static String Line() throws Exception {
String s = br.readLine();
return s;
}
// 读取一个整数输入数据
public static int Int() throws Exception {
st.nextToken();
return (int) st.nval;
}
// 读取一个长整型输入数据
public static Long Long() throws Exception {
st.nextToken();
return (long) st.nval;
}
// 读取一个双精度浮点型输入数据
public static double Double() throws Exception {
st.nextToken();
return st.nval;
}
// 求两个整数的最大公约数
public static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
// 求两个整数的最小公倍数
public static int clm(int a, int b) {
return a * b / gcd(a, b);
}
}