- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
java解法
- 解题思路
- 这段代码的目标是判断一组权重是否可以分成两个非空子集,使得两个子集的按位异或结果相等。如果可以,则返回两个子集总和的最大值;如果不能,则返回 -1。
核心思想
异或的性质:
如果一组数字的异或值为 0,说明可以划分为两个异或结果相等的子集。
异或运算满足交换律和结合律,因此排列顺序不影响结果。
最大子集总和计算:
如果异或值为 0,将权重总和减去最小值,得到最大子集总和。
如果异或值不为 0,说明无法划分,返回 -1。
排序的作用:
排序便于直接找到最小值,简化后续计算
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int size = input.nextInt();
int[] weights = new int[size];
for (int i = 0; i < size; i++) {
weights[i] = input.nextInt();
}
System.out.println(findMaxWeight(size, weights));
}
public static int findMaxWeight(int size, int[] weights) {
Arrays.sort(weights);
int minVal = weights[0];
int xorVal = minVal;
int totalWeight = minVal;
for (int i = 1; i < size; i++) {
xorVal ^= weights[i];
totalWeight += weights[i];
}
return xorVal == 0 ? totalWeight - minVal : -1;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
C++解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
核心思想
异或运算的性质:
异或运算满足交换律和结合律。
如果一组数字的异或值为 0,则说明可以划分为两个异或值相等的子集。
总和计算:
如果可以划分,总和的最大值是所有权重的总和减去最小值(即,将最小值分配到一个子集,其余权重分配到另一个子集)。
如果不能划分,直接返回 -1
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 2) {
const n = parseInt(lines[0]);
const weights = lines[1].split(" ").map(Number);
console.log(computeWeights(n, weights));
lines.length = 0;
}
});
function computeWeights(n, weights) {
const minWeight = Math.min(...weights);
let bitwiseSum = 0;
let totalSum = 0;
for (let weight of weights) {
bitwiseSum ^= weight;
totalSum += weight;
}
if (bitwiseSum === 0) {
return totalSum - minWeight;
} else {
return -1;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: