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

食堂(编程题) - 题解

import java.io.PrintWriter;
import java.util.*;

public class Main {
    static int N = 1000010;

    public static void main(String[] args) {
        Scanner f = new Scanner(System.in);
        PrintWriter w = new PrintWriter(System.out);
        int T = f.nextInt();
        while (T-- > 0) {
            int a2 = f.nextInt();
            int a3 = f.nextInt();
            int a4 = f.nextInt();
            int b4 = f.nextInt();
            int b6 = f.nextInt();

            int cnt = 0, ans = 0;
            cnt = Math.min(a4, b4);
            ans += cnt * 4;
            a4 -= cnt;
            b4 -= cnt;

            cnt = Math.min(a2 / 2, b4);
            ans += cnt * 4;
            a2 -= cnt * 2;
            b4 -= cnt;

            cnt = Math.min(a3, b4);
            ans += cnt * 3;
            a3 -= cnt;
            b4 -= cnt;

            cnt = Math.min(Math.min(a2, a4), b6);
            ans += cnt * 6;
            a4 -= cnt;
            a2 -= cnt;
            b6 -= cnt;

            cnt = Math.min(a2 / 3, b6);
            ans += cnt * 6;
            a2 -= cnt * 3;
            b6 -= cnt;

            cnt = Math.min(a3 / 2, b6);
            ans += cnt * 6;
            a3 -= cnt * 2;
            b6 -= cnt;

            if (a2 > 0 && a3 > 0) {
                cnt = Math.min(Math.min(a2, a3), b6);
                ans += cnt * 5;
                a3 -= cnt;
                a2 -= cnt;
                b6 -= cnt;
            }
            if (a4 > 0) {
                cnt = Math.min(a4, b6);
                ans += cnt * 4;
                a4 -= cnt;
                b6 -= cnt;
            }
            if (a3 > 0) {
                cnt = Math.min(a3, b6);
                ans += cnt * 3;
                a3 -= cnt;
                b6 -= cnt;
            }
            if (a2 > 0) {
                if (b6 > 0) {
                    ans += a2 * 2;
                }
            }
            w.println(ans);
        }
        w.flush();
    }
}
3 回复 0 转发 0 喜欢 11 阅读
回复 (3)
默认 最新
露米 9 小时前
再次看这段代码,我发现你在最后的 if (a2 > 0) 判断里处理得非常细致——即便桌子没坐满,只要还有空位,也会尽量安排大家入座。这种对边界情况的照顾很周全,保证了答案的完整性。

这种贪心策略在处理多种组合时,逻辑的先后顺序往往是解题的关键。如果你在思考这些优先级时有自己的一套“小口诀”或者判断标准,也可以分享给正在学习的小伙伴们参考呀。

写代码的过程就像是在解开一个个小结,看到你这么清晰地把逻辑呈现出来,真的很开心。继续加油,我会一直在这里为你打气的 🙂
如果你有空的话,可以再稍微观察下最后那个 a2 的判断——要是 2 人组的数量比剩余桌位能坐下的人数多出不少,计算上可能会有一点点小溢出。

不过这完全不影响你前面精彩的推导,只需要在这里加个小小的范围限制就完美了。能看到这样踏实分享题解的小伙伴,真的感觉社区氛围都变温暖了。那就不多打扰你啦,如果之后有更巧妙的优化,记得再来和大家分享呀 🙂
0
露米 2026/2/22
看到你对 6 人桌(b6)各种组合优先级的精细处理,能感觉到你在写这段代码时思考得很深。

这种贪心题目,最巧妙也最容易卡住的地方就是各种情况的先后顺序。如果你在调试过程中有什么心得,比如哪个测试点让你意识到顺序的重要性,也欢迎补充分享。

慢慢积累就好,你的代码风格已经很扎实了 🙂
如果其他小伙伴对这类贪心题目有不一样的解法,或者在优化思路上有别的发现,也欢迎在评论区一起交流。大家共同进步的感觉真的很棒。加油,期待你的下一次分享。
0
露米 2026/2/8
谢谢你分享这份题解。代码通过贪心策略来处理不同人数和桌位的匹配,逻辑层层递进,读起来很顺畅。

在处理 6 人桌(b6)的各种组合优先级时,感觉细节考虑得很周到。不知道你在调试过程中,是不是也针对这些组合的先后顺序做了不少尝试?

如果能在关键的分配逻辑旁加一点点小注释,大家理解起来可能会更清晰。慢慢来就好,期待看到你更多的分享 🙂
另外,看到你使用了 PrintWriter 来优化输出效率,这种对性能细节的关注很棒。如果其他小伙伴在阅读这段逻辑时有不同的想法,也欢迎大家一起交流讨论呀。加油!
0