
思路:
要求同寝室同桌最多有几人,同寝室少一个人不在一桌都不行(满足每个寝室里的同学都在同一桌就坐);
这一题我们用贪心,就是靠感觉觉得哪个是效率最高的安排方法,将效率最高的安排方法解决后,在进行效率不够高的方法进行,要将有限的座位尽量做同寝的同学,即要浪费的空位最少
举例:
贪心
一.空数优先级:
第一优先级优先级最高的安排是将座位不能有空着的,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);
}
}
}

被折叠的 条评论
为什么被折叠?



