あなたは、ゲームのバリエーション遊んでいる あなたは多重集合持っ当初2048の SのS nは n個の整数を。このマルチセット内のすべての整数は2の累乗です。
あなたはこのマルチセットで任意の数の(おそらく、ゼロ)の操作を行うことができます。
各操作中に次の2つの選択 から等しい整数 のS、Sをからそれらを削除する のS sおよびへのそれらの和に等しい数の挿入 秒の秒。
例えば、もし Sの= { 1 、2 、1 、1 、4 、2 、2 }、S = {1,2,1,1,4,2,2}と選択した整数 2 2、 2 2、次いでマルチセットとなる { 1 、1 、1 、4 、4 、2 }、{1,1,1,4,4,2}。
数場合は、勝つ 2048 2048あなたの多重集合に属しています。例えば、場合 S = { 1024 、512 、512 、4 }次のように勝つことができるS = {} 1024,512,512,4:選択 512 512及び 512 512、あなたの多重集合が変身 { 1024 、1024 、4 } 1024 { 、1024,4}。そして、選択 1024 1024と 1024あなたのマルチセットがに変わり、1024 { 2048 、4 } {2048,4}、あなたが勝ちます。
あなたはこのゲームに勝つことができるかどうかを判断しなければなりません。
あなたは答えなければならない のq qは独立したクエリを。
入力
最初の行は1つの整数含ま Qの Q(1つの≤ Q ≤ 100クエリの数- 1≤q≤100を)。
各クエリの最初の行は、一つの整数含有 N、N(1 ≤ N ≤ 100多重集合の要素数を- 1≤n≤100)。
各クエリの2行目に含まれる N nは整数 S 1 、sは2 、... 、S N S1、S2、...、Snは(1つの≤ sはiが≤ 2 29 1≤si≤229) -多重集合の説明。マルチセットのすべての要素が2の累乗であることが保証されています。
出力
各クエリ印刷の場合 YES、数に得ることが可能であれば 2048と、お使いのマルチセットで2048 NOそう。
あなたは(たとえば、文字列は、あなたが好きな場合はすべての文字を印刷することができる はい、 はい、 はいと YESすべてが肯定的な回答として認識されます)。
例
6
4
1024 512 64 512
1
2048
3
64 512 2
2
4096 4
7
2 2048 2048 2048 2048 2048 2048
2
2048 4096
はい
はい
番号
番号
はい
はい
注意
In the first query you can win as follows: choose 512512 and 512512, and ss turns into {1024,64,1024}{1024,64,1024}. Then choose 10241024 and 10241024, and ss turns into {2048,64}{2048,64} and you win.
In the second query ss contains 20482048 initially.
题意:
给出一串数,所有的数全部都是2的次方。判断能否组成2048,里面的出现的数字可以由两个相同数字的和进行替换,比如2,2,8可以变成4,8。能输入YES,否则输出NO。
思维点:
首先要判断给的数据中有没有2048,要是存在2048就可以直接输出YES了,否则继续判断。
2048=2^11,1024=2^10,可以发现2的0次方一直加到2的10次方的和刚好是2047,如果说累加出来的sum大于2047,也就是说大于等于2048的话即可,
但是需要注意的是一旦遇到一个大于2048的,就不能进行累加。
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 6 typedef long long ll; 7 using namespace std; 8 9 ll a[110],b[110]; 10 11 int main() 12 { 13 int t; 14 scanf("%d",&t); 15 while(t--) 16 { 17 int n; 18 scanf("%d",&n); 19 int flag=0; 20 for(int i=0;i<n;i++) 21 { 22 scanf("%lld",&a[i]); 23 if(a[i]==2048) 24 flag=1; 25 } 26 if(flag) 27 printf("YES\n"); 28 else 29 { 30 sort(a,a+n); 31 ll sum=0; 32 int flag=1; 33 for(int i=0;i<n;i++) 34 { 35 if(a[i]>=2048) 36 continue; 37 sum+=a[i]; 38 39 } 40 if(sum>=2048) 41 printf("YES\n"); 42 else 43 printf("NO\n"); 44 } 45 } 46 return 0; 47 }