华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
Solo 和 koko 是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。现在他们想要将这些积分成两堆。
哥哥 Solo 负责分配,弟弟 koko 要求两个人获得的积木总重量"相等”(根据 Koko 的逻辑),个数不同,不然就会哭,但 koko 只会先将两个数转成二进制再进行加法,而且总会忘记进位(每个进位都忘记)如当 25 (11101) 加 11 (01011) 时,koko 得到的计算结果是 18 (10010) :
11001
+ 01011
--------
10010
Solo 想要尽可能使自己得到的积木总重量最大,且不让 koko 哭。
第一行是一个整数 N(2≤N≤100),表示有多少块积木;
第二行为空格分开的 N 个整数Ci(1≤Ci≤106),表示第 i 块积木的重量。
如果能让 koko 不哭,输出 Solo 所能获得积木的最大总重量; 否则输出“NO”。
public class OdTest01 {
// koko算法:将两个数转成二进制再进行加法,而且总会忘记进位
// Solo 想要尽可能使自己得到的积木总重量最大,且不让 koko 哭
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.valueOf(sc.nextLine());
int[] arr = Arrays.asList(sc.nextLine().split(" ")).stream().mapToInt(Integer::parseInt).toArray();
// 升序
Arrays.sort(arr);
int min = arr[0];
// solo的总重量
int sum1 = min;
// Koko错误的总重量
int sum2 = min;
for (int i = 1; i < arr.length; i++) {
sum1 += arr[i];
// 二进制按位异或运算
sum2 ^= arr[i];
}
// 可以平分
if (sum2 == 0) {
System.out.println(sum1 - min);
} else {
// 无法平分
System.out.println("NO");
}
}
}
3
3 5 6
11
🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。