Luogu CF1221A 2048 Game题解

【问题分析】

本题中只能相加,所以大于2048的数都没用,这使得本题有用的数据最大为2048, 所以可用桶排也是理所当然啦!用桶把小于等于2048的数都装进桶中从桶1开始把可以相加的数都进上去,直到1024,因为1024是相加小于等于2048中的最大数。

【设计程序】

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<queue>
 6 using namespace std;
 7 const int N = 3000 + 5;
 8 int a[N];
 9 int n, t, sum;
10 int main()
11 {
12     int Q;
13     scanf ("%d", &Q);
14     while(Q--)//Q次询问
15     {
16         scanf ("%d", &n);
17         memset (a, 0, sizeof(a));//每次清空桶
18         for (int i = 0;i < n; i++) 
19         {
20             scanf ("%d", &t); //输入t
21             if(t <= 2048)//如果小于等于2048
22                 a[t]++;//装入桶中
23         }
24         for (int i = 1;i < 2048; i *= 2)//小于2048的数
25         {
26             a[i * 2] += a[i] / 2;
27             //i的两倍的数量加上有几组2个i
28         }
29         if(a[2048] > 0)//如果有2048
30             printf ("YES\n");//输出YES
31         else//否则
32             printf ("NO\n");//输出NO
33     }
34     return 0;
35 }


【代码调试】
1. 测试样例

2. 自测数据(边界值,特殊值)

自测:

2

11

1024 512 256 128 64 32 16 8 4 2 1

11

1024 512 256 128 64 32 16 8 4 2 2

完结撒花

posted @ 2022-01-08 13:14  睡不醒的凪  阅读(19)  评论(0)    收藏  举报