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
完结撒花