分糖果 的解题报告

链接:http://218.75.208.59:8084/acmhome/problemdetail.do?&method=showdetail&id=1061

描述

肖恩和帕特里克是兄弟,他们从他们的父母那里得到了很多糖果。每一块糖具有一个的正整数的价值,孩子们希望分他们得到的糖果。首先,肖恩将这些糖果分成两堆,并选择一堆给帕特里克。然后,帕特里克将尝试计算每堆的价值,其中每堆的价值是在那堆的糖果价值的总和,如果他觉得没有平等的价值,他将开始哭了起来。

不幸的是,帕特里克太小了,所以不能正确的计算。他只会二进制无进位的加法。比如说,他想算12(二进制为1100)加5(二进制为101),他会把最右边的两位加法算正确,但是第三位会忘记进位。(即0+0=0,0+1=1,1+0=1,1+1=0)

因此,帕特里克算125的结果为9下面几个是帕特里克算的结果:

5 + 4 = 1

7 + 9 = 14

50 + 10 = 56

肖恩数学很好,他想得到价值总和更高的糖果并且不让他的弟弟哭。如果可能,他会分成两个非空的糖果袋,让帕特里克认为,双方都有相同的值的糖果。给你每一袋糖果每一块糖果的价值,我们想知道是否可能让帕特里克相信他们得到糖果价值的总量是相同的。如果可能计算出肖恩能得到的最大的价值。


输入

第一行输入T(1<T<1000)组测试数据。接下来是T行,每行包含以下数据,N C1 C2 .. Cn
(N(2 ≤ N ≤ 1000)代表从父母那里得到糖果的总数,C(1 ≤ Ci ≤ 10^6)代表每块糖果的价值)

输出

若不能输出NO,若能则输出肖恩得到的最大的价值。

样例输入

2
5 1 2 3 4 5
3 3 5 6

样例输出

NO
11

简单的异或运算符的应用

1 /********* 分糖果 *************/
2 /********* 琴心&剑胆 ************/
3 /********* 2011/5/17 ************/
4 #include<stdio.h>
5  int main(){
6 int T;
7 scanf( "%d",&T );
8 while( T-- ){
9 int n,min=32767,t,f,sum=0;
10 scanf( "%d",&n );
11 for( int i=0;i<n;++i ){
12 scanf( "%d",&f );
13 min=min<f?min:f;
14 sum+=f;
15 if( i ){
16 t=t^f;
17 }
18 else t=f;
19 }
20 if( t )
21 printf( "NO\n" );
22 else printf( "%d\n",sum-min );
23 }
24 }

原文地址:https://www.cnblogs.com/jian1573/p/2048797.html