分苹果
难度:★★
题目理解起来复杂,实际不难。
分苹果
知识点位运算进制转换
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100 + 0101=9),B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。输入苹果的数量和每个苹果重量,输出满足A的情况下B获取的苹果总重量。如果无法满足A的要求,输出-1。
数据范围
1<= 总苹果数量 <= 20000
1 <= 每个苹果重量 <= 10000
输入描述:
输入第一行是苹果数量: 3
输入第二行是每个苹果重量: 3 5 6
输出描述:
输出第一行是B获取的苹果总重量:11
补充说明:
按照A的计算方法 5+6=3(101+110不算进位的话值为3)
示例1
输入:
3
3 5 6
输出:
11
示例2
输入:
8
7258 6579 2602 6716 3050 3564 5396 1773
输出:
35165
解题思路:
题目要求将苹果分成两堆,其中A希望按照二进制加法的规则等分苹果,而B希望在满足A的情况下获取苹果重量最多,因为是二进制不进位加法,所以我们可以用异或来模拟加法。
JAVA代码:
public static void main(String[] args) {
// 创建 Scanner 对象来读取输入
Scanner scan = new Scanner(System.in);
// 读取苹果数量 n
int n = scan.nextInt();
// 读取第一个苹果的重量,并初始化最小重量和总重量为第一个苹果的重量
int temp = scan.nextInt();
int min = temp;
int sum = temp;
// 循环读取每个苹果的重量
for (int i = 1; i < n; i++) {
int a = scan.nextInt();
// 将当前苹果的重量加到总重量上
sum += a;
// 更新最小重量为当前重量和最小重量的较小值
min = Math.min(min, a);
// 通过异或操作计算 A 的计算结果
temp = temp ^ a;
}
// 关闭 Scanner 对象
scan.close();
// 判断 A 的计算结果是否满足要求,并输出结果
System.out.println(temp == 0 ? (sum - min) : -1);
}
代码说明:
代码思路和实现说明如下:
- 创建一个
Scanner
对象来读取输入。 - 读取第一个输入的整数
n
,表示苹果数量。 - 读取第一个苹果的重量
temp
,并将其赋值给min
和sum
。 - 使用一个循环从1到n-1,依次读取每个苹果的重量。
- 在循环中,将当前苹果的重量加到
sum
上,更新min
为当前重量和min
的较小值。 - 将当前苹果的重量与
temp
进行异或操作,将结果赋值给temp
,用于计算A的计算结果。 - 循环结束后,关闭
Scanner
对象。 - 判断
temp
是否等于0,如果等于0,则表示A的计算结果满足要求,输出sum - min
,即B获取的苹果总重量;否则,输出-1。
代码的实现思路是通过循环读取每个苹果的重量,累计总重量sum
和最小重量min
,使用异或操作符^来计算A的计算结果temp,并且利用了异或运算的性质:相同位为0,不同位为1。在不计算进位的情况下,异或运算可以模拟二进制加法。最后根据temp
的值判断是否满足A的要求,并输出相应的结果。