题目描述

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表示无法实现
        }
    }
}
最后修改:2024 年 05 月 02 日
如果觉得我的文章对你有用,请随意赞赏