2024年蓝桥杯JavaB组第4题

0食堂 - 蓝桥云课

 思路:

要求同寝室同桌最多有几人,同寝室少一个人不在一桌都不行(满足每个寝室里的同学都在同一桌就坐);

这一题我们用贪心,就是靠感觉觉得哪个是效率最高的安排方法,将效率最高的安排方法解决后,在进行效率不够高的方法进行,要将有限的座位尽量做同寝的同学,即要浪费的空位最少

举例:

贪心

一.空数优先级:

第一优先级优先级最高的安排是将座位不能有空着的,6人桌可以有2+2+2,3+3,4+2,4人桌可以有2+2,4;

第二优先级是只有一个空位,6人桌可以有2+3,4人桌可以有 3;

第三优先级是有两个空位,6人桌有 4,4人桌有 2;

第四优先级是有3个空位,6人桌有 3;

第五优先级是由4个空位,6人桌有 2;

优先级中只有满足条件才可以进行,优先级以排列好了,我们要尽量要优先级低的少出现;

还有两个不好想到的优先级

二.优先安排人多的寝室:

人多的先安排上,不会直接浪费人多的,少一个人就浪费一个寝的人数

三.优先安排4人桌:

4人桌容易直接浪费一些空位,因为空位少,提供的组合少;6人桌因为空大可以提供更多的组合,提供的组合多即代表可以安排的人更多,浪费的会比用4人桌解决剩余的人数少。

以上3大优先级结合起来

  (一)4人桌,先安排人多的寝室,再安排人少的寝室(先四人寝再二人寝),同时要满族不要有空位;

  (二)再安排6人桌,先安排人多的寝室,再安排人少的寝室(先四人寝再三人寝再二人寝),同时满足不要有空位;

(三)不空位的已经安排完了,往后排空一个人,空两个人,空三个人,空四个人的情况。

import java.util.Scanner;

public class 第四题 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int q = sc.nextInt();
        while (q-- > 0) {
            int a2 = sc.nextInt(); // 两人寝
            int a3 = sc.nextInt(); // 三人寝
            int a4 = sc.nextInt(); // 四人寝
            int b4 = sc.nextInt(); // 四人桌
            int b6 = sc.nextInt(); // 六人桌

            long ans = 0;
            int t;

            // 1. 一个四人寝室放到四人桌
            t = Math.min(a4, b4);
            ans += t * 4;
            a4 -= t;
            b4 -= t;

            // 2. 两个两人寝放到四人桌
            t = Math.min(a2 / 2, b4);
            ans += t * 4;
            a2 -= t * 2;
            b4 -= t;

            // 3. 一个四人寝 + 一个两人寝放到六人桌
            t = Math.min(b6, Math.min(a4, a2));
            ans += t * 6;
            a4 -= t;
            a2 -= t;
            b6 -= t;

            // 4. 两个三人寝放到六人桌
            t = Math.min(b6, a3 / 2);
            ans += t * 6;
            a3 -= t * 2;
            b6 -= t;

            // 5. 三个两人寝放到六人桌
            t = Math.min(b6, a2 / 3);
            ans += t * 6;
            a2 -= t * 3;
            b6 -= t;

            // 6. 一个三人寝 + 一个两人寝放到六人桌
            t = Math.min(b6, Math.min(a3, a2));
            ans += t * 5;
            a3 -= t;
            a2 -= t;
            b6 -= t;

            // 7. 一个三人寝放到四人桌
            t = Math.min(b4, a3);
            ans += t * 3;
            a3 -= t;
            b4 -= t;

            // 8. 一个四人寝放到六人桌
            t = Math.min(b6, a4);
            ans += t * 4;
            a4 -= t;
            b6 -= t;

            // 9. 两个两人寝放到六人桌
            t = Math.min(b6, a2 / 2);
            ans += t * 4;
            a2 -= t * 2;
            b6 -= t;

            // 10. 一个两人寝放到四人桌
            t = Math.min(b4, a2);
            ans += t * 2;
            a2 -= t;
            b4 -= t;

            // 11. 一个三人寝放到六人桌
            t = Math.min(b6, a3);
            ans += t * 3;
            a3 -= t;
            b6 -= t;

            // 12. 一个两人寝放到六人桌
            t = Math.min(b6, a2);
            ans += t * 2;
            a2 -= t;
            b6 -= t;

            System.out.println(ans);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值