北方大学 ACM 多校训练赛 第十五场 数字游戏
生活随笔
收集整理的這篇文章主要介紹了
北方大学 ACM 多校训练赛 第十五场 数字游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本題的意思是,給你1/2,1/2,1,2,4……2^(k-1) ,讓你在左邊的數列中添加+號或者-號,使得最終的答案為n即可。
思路:
我們知道上面這些數直接如果全部都填+號的話,那么最終得到的數為2^k,而如果我們把其中的一個數如2^(j)前面的+號改成-號的話,那么結果將減少2*2^(j),我們從這個角度出發,考慮r = 2^(k) - n,也就是需要把和為r/2的數前面的+變成-。那么我們只需要把(r/2)的二進制表示中為1的位對應的出現在數列中的數前面的+改成-就好了。
代碼實現:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define int long long int ops[66]; main(){int T;scanf("%lld",&T);while(T--){memset(ops,0,sizeof(ops));int n,k;cin>>k>>n;int r = ((int)1<<k) - n;int cnt = 1;while(r){if(r&1){ops[cnt] = 1;}r >>= 1;cnt++;}for(int i = 1 ;i <= k+1;i++){if(i != 1){cout<<' ';}if(ops[i]){cout<<'-';}else{cout<<'+';}}cout<<endl;}return 0; }總結
以上是生活随笔為你收集整理的北方大学 ACM 多校训练赛 第十五场 数字游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北方大学 ACM 多校训练赛 第十五场
- 下一篇: 电脑微信文件存储位置在哪里微信文件在电脑