【蓝桥杯算法】【贪心】食堂【2023/3/31】

贪心怎么做?
首先要考虑直接就能满足要求的,
然后再考虑稍微能满足要求的,
最后才考虑次之;

这道题首先要考虑能坐满的情况;
然后再考虑一桌剩一个人的情况;
然后在考虑一桌剩两个人的情况...

题目:
image

image

image

image


import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

         ///贪心

        int q=sc.nextInt();
        for (int i = 0; i < q; i++) {
            int a2=sc.nextInt();
            int a3=sc.nextInt();
            int a4=sc.nextInt();

            int b4=sc.nextInt();
            int b6=sc.nextInt();

            int ans=0;
            //最优直接占满
            //四人寝占四人桌
            while(b4>0&&a4>0){
                b4--;
                a4--;
                ans+=4;
            }
            //两人寝捆绑2占满四人桌
            while(b4>0&&a2>=2){
                b4--;
                a2-=2;
                ans+=4;
            }
            //三人寝捆绑2占满六人桌
            while(b6>0&&a3>=2){
                b6--;
                a3-=2;
                ans+=6;
            }
            //两人寝+四人寝捆绑占满六人桌
            while(b6>0&&a2>0&&a4>0){
                b6--;
                a2--;
                a4--;
                ans+=6;
            }
            //两人寝捆绑3占满六人桌
            while(b6>0&&a2>=3){
                b6--;
                a2-=3;
                ans+=6;
            }
            //若四人桌仍有空余,并且占不满,先用3人寝,再用两人寝
            while(b4>0&&a3>0){
                //浪费1个人
                b4--;
                a3--;
                ans+=3;
            }
            //若六人桌仍有空余,并且占不满,先用3+2,再用4,再用2*2,再用3,再用2
            while(b6>0&&a3>0&&a2>0){
                //浪费一个人
                b6--;
                a3--;
                a2--;
                ans+=5;
            }
            while(b6>0&&a2>=2){
                b6--;
                a2-=2;
                ans+=4;
            }
            //这个两人寝一张桌子要浪费两个人,我们先不考虑这个,先考虑浪费一个人的
            while(b4>0&&a2>0){
                //浪费两个人
                b4--;
                a2--;
                ans+=2;
            }

            while(b6>0&&a4>0){
                //浪费2两个人
                b6--;
                a4--;
                ans+=4;
            }
            while(b6>0&&a3>0){
                //浪费三个人
                b6--;
                a3--;
                ans+=3;
            }
            while(b6>0&&a2>0){
                //浪费4个人
                b6--;
                a2--;
                ans+=2;
            }

            System.out.println(ans);

        }

    }


}
posted @ 2026-03-31 18:31  Jwwind  阅读(11)  评论(0)    收藏  举报