Qualification Round Problem C. Candy Splitting

嘻嘻,这题做得还算轻松,题目的加法过程就是们运算的异或运算

首先我们假设给出的数可以被分成两堆,其中全部数异或后相等,

A堆{a1,a2,a3,a4……an}, B堆{b1,b2,b3,b4……bm}

 a1^a2^a3^a4……^an = b1^b2^b3^b4……^bm,那么很容易知道

上两边同时异或(an--a2)a1 = b1^b2^b3^b4……bm^an^a(n-1)^a(n-2)……^a3^a2

也就是对于给写的(n+m)个数只要其中一个数 == 其它所有数的异或,这些数就可以被分

成这样的两堆,剩下的问题就是怎么分才可以使其中一堆最大,另一堆最小的问题了

这个什分简单就是排下序就行了,让最小的那个数单独一堆,其余数一堆(其和就是可能的最大值)

 

代码如下:

#include<iostream> #include<cstdlib> #define N 1005 using namespace std; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int tcase; int n; int sum; int walk = 0; int i; int arr[N]; FILE *in,*out; in = freopen("C-large.in","r",stdin); out = freopen("C-large.txt","w",stdout); cin >>tcase; while(tcase--){ cin >>n; for(i = 0;i < n;i++){ cin >>arr[i]; } qsort(arr,n,sizeof(arr[0]),cmp); sum = arr[1]; for(i = 2;i < n;i++){ sum += arr[i]; arr[i] ^= arr[i-1]; } if(arr[0] != arr[n-1]) cout << "Case #" << ++walk <<": "<<"NO" <<endl; else cout << "Case #" << ++walk <<": "<<sum <<endl; } fclose(in); fclose(out); return 0; }

你可能感兴趣的:(File)