CodeForces - 1270C Make Good(思维+构造)
題目鏈接:點(diǎn)擊查看
題目大意:給出一個(gè)由n個(gè)數(shù)字構(gòu)成的數(shù)列,現(xiàn)在已知其累加和為sum,異或和為xor,現(xiàn)在允許我們向數(shù)列中添加0~3個(gè)數(shù),以滿足sum=2*xor,構(gòu)造出任意一種方案
題目分析:一開始我想分情況討論的,就是在求出sum和xor之后,討論一下其大小關(guān)系,如果sum小于2*xor的話,直接補(bǔ)齊兩個(gè)其差值的一半就好了,因?yàn)樾卵a(bǔ)的兩個(gè)數(shù)對(duì)xor不做貢獻(xiàn),而對(duì)sum的貢獻(xiàn)就是差值,可以滿足條件了,不過需要對(duì)奇偶討論一下,因?yàn)槠鏀?shù)的一半會(huì)出現(xiàn)小數(shù),這個(gè)時(shí)候我們就可以用第三個(gè)數(shù)來補(bǔ)齊一下了,也就是先讓sum加一,再讓xor異或1,這個(gè)時(shí)候其差值就是偶數(shù)了,剩下的就是當(dāng)sum大于2*xor的時(shí)候,這個(gè)時(shí)候我考慮到首先加上一個(gè)數(shù),讓其回到第一種情況即可,不過這樣想下來構(gòu)造所需要處理的細(xì)節(jié)就太多太多了。。很不可取,即使勉強(qiáng)寫出來了也耗費(fèi)了不少時(shí)間,而且應(yīng)該很難1A
這個(gè)時(shí)候我們就可以直接從公式出發(fā),先將數(shù)字抽象出來,在輸入完成后我們只有sum和xor兩個(gè)數(shù)值,若想滿足sum=xor*2,因?yàn)椴豢煽匾蛩剌^多,我們不妨先把xor給消掉,也就是添加一個(gè)數(shù),令其權(quán)值等于xor,這樣等式就變成了sum+xor=2*(xor^xor),也就是sum+xor=0,這有個(gè)什么好處呢,這個(gè)公式的等式右邊,也就是需要異或的地方變成了零,接下來我們無論添加的數(shù)為多少,會(huì)造成的貢獻(xiàn)就是等式兩邊都加上相同的數(shù)值,因?yàn)槲覀冃枰S持兩倍的關(guān)系,所以完全可以添加一個(gè)sum+xor,這樣等式兩邊就可以符合題意了
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);LL sum=0,_xor=0;for(int i=1;i<=n;i++){LL num;scanf("%lld",&num);sum+=num;_xor^=num;}printf("2\n");printf("%lld %lld\n",_xor,_xor+sum);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1270C Make Good(思维+构造)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1041 John's tr
- 下一篇: CodeForces - 1270D S