18. 分积木
题目 分积木
难度 难
题目说明 Solo和koko是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。现在他们想要将这些积木分成两堆。哥哥Solo负责分配,弟弟koko要求两个人获得的积木总重量“相等”(根据Koko的逻辑),个数可以不同,不然就会哭,但koko只会先将两个数转成二进制再进行加法,而且总会忘记进位(每个进位都忘记)。如当25(11001)加11(1011)时,koko得到的计算结果是18(10010):
11001
+ 01011
-------------
10010
Solo想要尽可能使自己得到的积木总重量最大,且不让koko哭。
输入描述 3
3 5 6
第一行是一个整数N( 2≤ N ≤100 ),表示有多少块积木;第二行为空格分开的N个整数Ci(1 ≤ Ci ≤),表示第i块积木的重量。
输出描述 11
让koko不哭,输出Solo所能获得积木的最大总重量;否则输出“-1”。
补充说明 如果能让koko不哭,输出Solo所能获得的积木的总重量,否则输出-1。
该样例输出为 11 。
解释:Solo 能获得重量为 5 和 6 的两块积木,5 转换成二进制是 101, 6 的二进制是 110,按照 kolo 的计算方法(忘记进位),结果为 3(二进制 011)。kolo 获得重量为 3 的积木,而 solo 获得重量为 11(十进制,5 + 6)的积木。
------------------------------------------------------
示例
示例1
输入 3
输出 3 5 6
说明 11
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ZiJinShi/article/details/132872529
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.Solo和Koko分积木,每个积木有自己的重量
2.Solo负责分配,koko希望两人获得的积木总重量“相等”
3.但是koko的算法不好,只会将两个数字转换成二进制再进行加法
4.并且koko一定会忘记进位。如25(11001)和11(1011)时,koko得到的计算结果是18
5.Solo希望自己得到的积木总重量最大,且不让koko哭
6.输入描述:第一行是一个整数N(n大于等于2小于等于100),表示有多少块积木;
第二行为空格分开的N个整数Ci(Ci大于等于1小于等于10的6次方),表示第i块积木的重量
7.输出描述:让koko不哭,solo能获得的最大总重量,否则输出“-1”
二、解题思路
1.弟弟实际上只会做异或运算我们可以使用"^"作异或运算
2.这个问题需要最后两个人获得的积木的总重量相等(对koko而言)
3.因为koko只会做异或运算,所以实际上最后solo的玩具的总重量异或koko的玩具的总重量等于0
4.也就是说只有所有玩具异或在一起的结果为0的情况下我们才认为此题有解
5.可是这样想想,那么直接所有的玩具都分配给solo不就完了么?(因为异或在一起结果是0)
6.所以证明弟弟至少要有一个玩具
7.所以只要我们先验证所有的玩具异或在一起的值为0
8.然后再将实际重量最小的分给koko(计算重量较大的n-1块积木重量的和就是答案)
(不知道我对题目的理解是否正确)
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main() {
int N;
scanf("%d", &N);
int weight[N];
int totalsolo = 0;
int totalkoko = 0;
int min = INT_MAX;
for(int i = 0; i < N; i++) {
scanf("%d", &weight[i]);
if(weight[i] < min) {
if(min != INT_MAX) totalsolo += min;
min = weight[i];
} else {
totalsolo += weight[i];
}
totalkoko ^= weight[i];
}
if(totalkoko == 0) {
printf("%d\n", totalsolo);
} else printf("-1\n");
return 0;
}