题目描述
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
示例:
输入 | 3 3 5 6 |
---|---|
输出 | 11 |
说明 | 无 |
输入 | 8 7258 6579 2602 6716 3050 3564 5396 1773 |
---|---|
输出 | 35165 |
说明 | 无 |
C算法源码
// C语言 控制台输入获取
#include <stdio.h>
// 获取结果的函数
int getResult(int n, int arr[]) {
int min = arr[0]; // 初始化最小值为数组的第一个元素
// 找到数组中的最小值
for (int i = 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
int fault = min;
int correct = min;
// 计算错误值和正确值
for (int i = 1; i < n; i++) {
fault = fault ^ arr[i]; // 计算错误值
correct += arr[i]; // 计算正确值
}
// 判断是否能够得到正确结果
if (fault == 0) {
return correct - min; // 返回结果
} else {
return -1; // 返回-1表示无法实现
}
}
int main() {
int n;
scanf("%d", &n); // 输入数组大小
int arr[n]; // 定义数组
// 输入数组元素
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 调用函数并打印结果
printf("%d\n", getResult(n, arr));
return 0;
}
Python算法源码
def get_result(n, arr):
arr.sort()
min_val = arr[0]
fault = min_val
correct = min_val
# 计算数组中所有元素的异或值
for i in range(1, len(arr)):
w = arr[i]
fault ^= w
correct += w
# 检查异或结果是否为0以确定数组是否可以重新排列
if fault == 0:
return correct - min_val
else:
return -1
if __name__ == "__main__":
n = int(input())
arr = list(map(int, input().split()))
print(get_result(n, arr))
Java算法源码
// Java Scanner 控制台输入获取
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
int n = scanner.nextInt(); // 数组大小
int[] arr = new int[n]; // 数组元素
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
// 调用算法并打印结果
System.out.println(getResult(n, arr));
}
// 算法实现
public static int getResult(int n, int[] arr) {
Arrays.sort(arr); // 对数组进行排序
int min = arr[0]; // 最小值为排序后数组的第一个元素
int fault = min; // 错误值初始化为最小值
int correct = min; // 正确值初始化为最小值
for (int i = 1; i < n; i++) {
int w = arr[i];
fault ^= w; // 计算错误值
correct += w; // 计算正确值
}
if (fault == 0) {
return correct - min; // 返回结果
} else {
return -1; // 返回-1表示无法实现
}
}
}
2 条评论
哈哈哈,写的太好了https://www.cscnn.com/
[...]面试算法题LeetCode原题简单序列题目编号频次1605. 种花问题 - 力扣(LeetCode)12125. 验证回文串 - 力扣(LeetCode)131961. 检查字符串是否为数组前缀 - 力扣(LeetCode)14504. 七进制数 - 力扣(LeetCode)15344. 反转字符串 - 力扣(LeetCode)161184. 公交站间的距离 - 力扣(LeetCode)17594[...]