【蓝桥杯算法】【贪心】食堂【2023/3/31】
贪心怎么做?
首先要考虑直接就能满足要求的,
然后再考虑稍微能满足要求的,
最后才考虑次之;
这道题首先要考虑能坐满的情况;
然后再考虑一桌剩一个人的情况;
然后在考虑一桌剩两个人的情况...
题目:




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);
}
}
}

浙公网安备 33010602011771号