题目描述:

有一个数字游戏叫做2048,此游戏的规则为,两个相同的数字能进行想加。例如:两个2可以想加,

则相加后4的个数加一,2的个数会减二。

现在有一串数字,为目前已知的数字的数量。问至少还需要几次相加,才能获得2048(题目保证能够相加得到2048)。

输入描述:

第一行为样例数 T,代表后面会 跟随T组测试数据。

每组测试数据输入10个数,分别代表

2,4,8,16,32,64,128,256,512,1024的个数。

每种数字的个数不超过1024。

输出描述:

对于每组数据,输出一个数,表示需要得到2048最少需要相加的次数。

示例:

输入:


3
2 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 2
1 256 1 1 1 2 1 1 1 1


输出:


10
1
4


#include <iostream>
#include <algorithm>
using namespace std;
struct node {
int data=1; //储存2 4 8 ...... 512 1024
int cnt=0; //储存对应的数据的个数
}number[11];
int main() {
int T, n, sum, count;
while (cin >> T) {
sum=0, count=0; //初始化
while (T--) {
for (int i = 1; i <= 10; i++) { //从下标1开始存
number[i].data = number[i - 1].data * 2;
cin >> number[i].cnt;
}
for (int i = 10; i >= 1; i--) { //从最大的1024开始加
count += number[i].cnt; // 记录加数的个数
if ((sum += number[i].data*number[i].cnt) == 2048)
break;//样本保证可以相加得到2048,直接break输出结果;
}
cout << count - 1 << endl;//加法的次数等于加数个数-1
count = 0;//注意这里:与一般的一个输入循环中只处理一个样例数据不同,
sum = 0;//这里每个输入循环中要处理T个样例数据,所以这里也要初始化;
}
}
return 0;
}