2026/4/18 5:58:28
网站建设
项目流程
兰甘肃网站建设,php免费网站系统,百度竞价是什么意思,营销型网站建设区别(新卷,200分)- 分积木#xff08;Java JS Python C#xff09;题目描述Solo和koko是两兄弟#xff0c;妈妈给了他们一大堆积木#xff0c;每块积木上都有自己的重量。现在他们想要将这些积木分成两堆。哥哥Solo负责分配#xff0c;弟弟koko要求两个人获…(新卷,200分)- 分积木Java JS Python C题目描述Solo和koko是两兄弟妈妈给了他们一大堆积木每块积木上都有自己的重量。现在他们想要将这些积木分成两堆。哥哥Solo负责分配弟弟koko要求两个人获得的积木总重量“相等”根据Koko的逻辑个数可以不同不然就会哭但koko只会先将两个数转成二进制再进行加法而且总会忘记进位每个进位都忘记。如当2511101加1101011时koko得到的计算结果是181001011001 01011 -------- 10010Solo想要尽可能使自己得到的积木总重量最大且不让koko哭。输入描述第一行是一个整数N(2≤N≤100)表示有多少块积木第二行为空格分开的N个整数Ci(1≤Ci≤106)表示第i块积木的重量。输出描述如果能让koko不哭输出Solo所能获得积木的最大总重量否则输出“NO”。用例输入33 5 6输出11说明无题目解析此题中Koko的计算逻辑其实就是按位异或即两个相应的二进制位值不同则为1否则为0。因此如果我们想按Koko的求和逻辑平分总重量的话必然要生成两份相同的二进制数重量而两个相同二进制数按位异或的结果就是0。因此我们只要按位异或所有重量最终结果为0的话才能按照Koko的逻辑平分总重量。而一旦可以平分总重量则减去任意一个重量都可以分成两份相同的二进制数而为了使Solo能分得最大重量则必然减去一个最轻的给Koko。JavaScript算法源码/* JavaScript Node ACM模式 控制台输入获取 */ 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).slice(0, n); console.log(getSoloMaxWeight(weights)); lines.length 0; } }); function getSoloMaxWeight(weights) { // 升序排序 weights.sort((a, b) a - b); const min weights[0]; // correctSum记录Solo计算的正确的总重量 let correctSum min; // faultSum记录Koko计算的错误的总重量 let faultSum min; for (let i 1; i weights.length; i) { correctSum weights[i]; // Koko的计算方法其实就是二进制按位异或运算即如果两个相应的二进制位值不同则为1否则为0。 faultSum ^ weights[i]; } // 如果按照Koko计算方法若想按重量平分必然会生成两份相同的二进制数而两个相同二进制数按位异或的结果必然是0 if (faultSum 0) { return correctSum - min; // faultSum0表示可以平分因此任意减去一个重量都可以得到两个相同的二进制数因此就减去最小的这样Solo就可以分得最重的 } else { return NO; // faultSum ! 0 表示无法按照Koko的逻辑平分 } }Java算法源码import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int[] weights new int[n]; for (int i 0; i n; i) weights[i] sc.nextInt(); System.out.println(getResult(n, weights)); } public static String getResult(int n, int[] weights) { // 升序 Arrays.sort(weights); int min weights[0]; // correctSum记录Solo计算的正确的总重量 int correctSum min; // faultSum记录Koko计算的错误的总重量 int faultSum min; for (int i 1; i weights.length; i) { correctSum weights[i]; // Koko的计算方法其实就是二进制按位异或运算即如果两个相应的二进制位值不同则为1否则为0。 faultSum ^ weights[i]; } // 如果按照Koko计算方法若想按重量平分必然会生成两份相同的二进制数而两个相同二进制数按位异或的结果必然是0 if (faultSum 0) { // faultSum0表示可以平分因此任意减去一个重量都可以得到两个相同的二进制数因此就减去最小的这样Solo就可以分得最重的 return correctSum - min ; } else { // faultSum ! 0 表示无法按照Koko的逻辑平分 return NO; } } }Python算法源码# 输入获取 n int(input()) weights list(map(int, input().split())) # 算法入口 def getResult(n, weights): weights.sort() minV weights[0] correctSum minV faultSum minV for i in range(1, n): correctSum weights[i] faultSum ^ weights[i] if faultSum 0: return str(correctSum - minV) else: return NO # 算法调用 print(getResult(n, weights))C算法源码#include stdio.h #include stdlib.h void getResult(int n, int weights[]); int main() { int n; scanf(%d, n); int weights[n]; for(int i0; in; i) { scanf(%d, weights[i]); } getResult(n, weights); return 0; } int cmp(const void* a, const void* b) { return (*(int*) a) - (*(int*) b); } void getResult(int n, int weights[]) { qsort(weights, n, sizeof(int), cmp); int min weights[0]; int correctSum min; int faultSum min; for(int i1; in; i) { correctSum weights[i]; faultSum ^ weights[i]; } if(faultSum 0) { printf(%d\n, correctSum - min); } else { puts(NO); } }