嘻嘻,這題做得還算輕鬆,題目的加法過程就是們運算的異或運算
首先我們假設給出的數可以被分成兩堆,其中全部數異或後相等,
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><br />#include<cstdlib><br />#define N 1005<br />using namespace std;</p><p>int cmp(const void *a,const void *b)<br />{<br />return *(int *)a-*(int *)b;<br />}</p><p>int main()<br />{<br />int tcase;<br />int n;<br />int sum;<br />int walk = 0;<br />int i;<br />int arr[N];<br />FILE *in,*out;<br />in = freopen("C-large.in","r",stdin);<br />out = freopen("C-large.txt","w",stdout);<br />cin >>tcase;<br />while(tcase--){<br />cin >>n;<br />for(i = 0;i < n;i++){<br /> cin >>arr[i];<br />}<br />qsort(arr,n,sizeof(arr[0]),cmp);<br />sum = arr[1];<br />for(i = 2;i < n;i++){<br />sum += arr[i];<br />arr[i] ^= arr[i-1];<br />}<br />if(arr[0] != arr[n-1])<br />cout << "Case #" << ++walk <<": "<<"NO" <<endl;<br />else<br />cout << "Case #" << ++walk <<": "<<sum <<endl;<br />}<br />fclose(in);<br />fclose(out);<br />return 0;<br />}