算法每一题,成长每一天~
C0E19 分苹果
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
Java
import java.util.Arrays;
import java.util.Scanner;
/**
* 分苹果
*/
public class C0E19 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
Arrays.sort(arr);
int sum = arr[0];
for (int i = 1; i < arr.length; i++) {
sum = sum ^ arr[i]; // 逐个异或
}
// 异或结果不等于 0,则 无法平分
if (sum != 0) {
System.out.println("-1");
return;
}
// 排除最小的第一个,剩下的相加
int res = 0;
for (int i = 1; i < arr.length; i++) {
res += arr[i];
}
System.out.println(res);
}
}
总结
1、读懂题意最关键。
2、熟悉二进制运算:
运算 | Java符号 | 规则 |
---|---|---|
与 | a & b | 都为1,则为1 |
或 | a | b | 有1个为1,就为1 |
非 | ~ a | 取反 |
异或 | a ^ b | 相同为0,不同为1 1 |
- a ^ a = 0. 因为每一位都相同,所以自己与自己异或运算之后,每一位都变成0,所以结果等于0。
算法要多练多练多练!!
“异或”运算,防止记反了,可以用 (a+b)去记忆,比如:0+0=0,0+1=1,1+1=10(忽略进位,就是1+1=0),所以是:相同为0,不同为1。 ↩︎