Qualification Round Problem C. Candy Splitting

來源:互聯網
上載者:User

嘻嘻,這題做得還算輕鬆,題目的加法過程就是們運算的異或運算

首先我們假設給出的數可以被分成兩堆,其中全部數異或後相等,

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 />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.