赞
踩
「小 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);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。