(Python)Solo和koko是两兄弟,妈妈给了他们一大袋糖,每块糖上都有自己的重量。现在他们想要将这些糖分成两堆。

分糖的任务当然落到了大哥Solo的身上,然而koko要求必须两个人获得的糖的总重量“相等”(根据Koko的逻辑),要不然就会哭的。

非常不幸的是,koko还非常小,并且他只会先将两个数转成二进制再进行加法,而且总会忘记进位。

如当12(1100)加5(101)时:

于是koko得到的计算结果是9(1001)。

此外还有一些例子:

  • 5 + 4 = 1
  • 7 + 9 = 14
  • 50 + 10 = 56

现在Solo非常贪婪,他想要尽可能使自己得到的糖的总重量最大,且不让koko哭。

输入

  • 输入的第一行是一个整数N(2 ≤ N ≤ 15),表示有袋中多少块糖。
  • 第二行包含N个用空格分开的整数Ci (1 ≤ Ci ≤ 10^6),表示第 i 块糖的重量。

输出

  • 如果能让koko不哭,输出Solo所能获得的糖的总重量,否则输出“NO”。

样例

输入样例 1

1

2

3

3 5 6

输出样例 1

1

11

提示样例 1

  • 样例1中,三块糖重量为3、5、6,因为5(101)+6(110)=3(11),所以Solo拿走了重为5和6的糖,koko则得到了重为3的糖。

输入样例 2

1

2

5

1 2 3 4 5

输出样例 2

1

NO

提示样例 2

样例2中五块糖,无论如何分,都无法满足koko的要求,所以输出NO。

分析:

加法不进位,显然是在做异或运算(^),异或运算又称不进位的二进制加法。

分糖成功的先决条件是koko和solo两方拥有相同重量的糖,也就是说,分成两堆数各自进行异或运算,运算到最后,剩下两个相等的数,那么对于相同的两个数,再做一次异或运算结果是0

对于判断是否能成功分糖,可以将所有的数执行一次异或运算,判断最终结果为0即意味着分糖成功,否则失败。

要让solo拿最多的糖,就要koko拿最少的糖,在分糖成功的情况下,只需要将所有糖中重量最小的糖分给koko,因为剩下的糖的总重量经过异或,肯定会等于koko拿的糖的重量,因此只需找出所有数中最小的数以及所有数十进制之和,最终Solo分得的糖的重量就等于和减去最小值。

from functools import reduce

candy_nums = int(input())
weight_list = sorted(input().strip().split(" "))
res = reduce(lambda x, y: int(x) ^ int(y), weight_list)

if res == 1:
    print("NO")
else:
    min = int(weight_list[0])
    all_sum = reduce(lambda x, y: int(x) + int(y), weight_list)
    print(all_sum - min)

个人解法,如有错误,欢迎指正,Thanks♪(・ω・)ノ

猜你喜欢

转载自blog.csdn.net/qq_43486538/article/details/132957275