CodeForces-1221A-2048ゲーム - 思考タイトル

あなたは、ゲームのバリエーション遊んでいる  あなたは多重集合持っ当初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 }

おすすめ

転載: www.cnblogs.com/OFSHK/p/11686537.html