蓝桥杯-小B的宿舍Java解法

本文介绍了一个关于宿舍楼内物品搬运的问题,通过运筹学方法设计出在走廊狭窄限制下,如何在10分钟内完成多人行李搬运,以达到最短时间的最优搬运计划。
摘要由CSDN通过智能技术生成

「小 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);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没道理99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值