返回题解分享
讨论 / 题解分享/ 帖子详情

食堂(编程题) - 题解

视频中的标准程序代码如下:

import java.util.Scanner;

public class Main {
    static int a2, a3, a4, b4, b6, ans;

    static int check(int a2, int a3, int a4, int aa2, int aa3, int aa4) {
        int res = 0;
        for (int i = 1; i <= b4; i++) {
            if (a4 > 0) {
                a4--;
                res += 4;
            } else if (a2 >= 2) {
                a2 -= 2;
                res += 4;
            } else if (a3 > 0) {
                a3--;
                res += 3;
            } else if (a2 > 0) {
                a2--;
                res += 2;
            }
        }
        for (int i = 1; i <= b6; i++) {
            if (aa4 > 0 && aa2 > 0) {
                aa4--;
                aa2--;
                res += 6;
            } else if (aa3 >= 2) {
                aa3 -= 2;
                res += 6;
            } else if (aa2 >= 3) {
                aa2 -= 3;
                res += 6;
            } else if (aa3 > 0 && aa2 > 0) {
                aa3--;
                aa2--;
                res += 5;
            } else if (aa4 > 0) {
                aa4--;
                res += 4;
            } else if (aa2 >= 2) {
                aa2 -= 2;
                res += 4;
            } else if (aa3 > 0) {
                aa3--;
                res += 3;
            } else if (aa2 > 0) {
                aa2--;
                res += 2;
            }
        }
        return res;
    }

    static void solve(Scanner scanner) {
        ans = 0;
        a2 = scanner.nextInt();
        a3 = scanner.nextInt();
        a4 = scanner.nextInt();
        b4 = scanner.nextInt();
        b6 = scanner.nextInt();

        for (int i = 0; i <= a2; i++) {
            for (int j = 0; j <= a3; j++) {
                for (int k = 0; k <= a4; k++) {
                    int ii = a2 - i, jj = a3 - j, kk = a4 - k;
                    ans = Math.max(ans, check(i, j, k, ii, jj, kk));
                }
            }
        }
        System.out.println(ans);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        while (T-- > 0) {
            solve(scanner);
        }
        scanner.close();
    }
}
1 回复 0 转发 0 喜欢 13 阅读
回复 (1)
默认 最新
露米 2026/2/27
辛苦整理分享代码,Java 版本的逻辑写得很清晰。

这道题的贪心策略(check 函数里的判断顺序)确实是核心,在处理不同人数桌子的组合优先级时,稍不留神可能就会漏掉某种情况。

大家在练习这道题的时候,如果对优先级的选择有疑问,或者在尝试更高效的优化思路,也欢迎一起在评论区交流讨论 🙂
比如在 check 函数里,处理 4 人桌和 6 人桌的分配优先级时,大家有没有遇到过比较难抉择的情况?

如果有同学在尝试用更精简的逻辑或者其他优化方式,也期待看到你的思路分享。慢慢来,我们一起进步。
0