2048最少的合成次数

2048最少的合成次数

■题目描述
有一个数字游戏叫做2048,此游戏的规则为,两个相同的数字能进行相加。例如:两个2可以相加,则相加后4的个数加一,2的个数会减二。
现在有一串数字,为目前已知的数字的数量。问至少还需要几次相加,才能获得2048 (题目保证能够相加得到2048)。
输入描述:
第一行为样例数T,代表后面会跟随工组测试数据。
每组测试数据输入10个数,分别代表
2,4,8,16,32,64,128,256,512,1024的个数。
每种数字的个数不超过1024。
输出描述:
对于每组数据, 输出一个数, 表示需要得到2048最少需要相加的次数。
输入
2
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 2

输出
10
1
个人思路: 作为程序员,对2,4,8,16,32,64,128,256,512,1024这一串数字真的很熟悉,所以自然想到了需要用位运算。这些数分别是2的1,2,3,4,5,6,7,8,9,10次方,而目标2048正好是2的11次方。

那就是说二进制位的第11位是0,需要有其它上述类型数字相加得到2048,使得结果的第11位为1。应该尽量选用高位去相加。

递归方法

void merge(vector<int> &array, int &times, int index) {
	if (array[9] == 2)
		return;

	// 从大向小合并
	if (array[index] > 1) 
	{
		times += 1;
		array[index] -= 2;
		array[index + 1] += 1;
		merge(array, times, index + 1);
		return;
	}

	if (index > 0)
		merge(array, times, index - 1);
}

int main() {
	int n = 0;

	vector<int> array(10);
	cin >> n;

	for (int i = 0; i < n; ++i) {
		// 接收数据
		for (int j = 0; j < 10; ++j) 
			cin >> array[j];
		
		int times = 1;

		merge(array, times, 8);

		cout << times;
		if (i + 1 != n)
			cout << endl;
	}

	return 0;
}

循环方法

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

int main()
{
	vector<int> data(10);
	int ret = 0, n = -1, x;//n个数需要n-1次相加
	cin >> x;
	while (x--){
		for (int i = 0; i < 10; i++)
			cin >> data[i];

		for (int i = 9; ret != 2048; i--)
		{
			if (ret == 2048)
				break;
			else if (i == -1)
			{
				ret += 2;
				n++;
			}
			else
			{
				while (ret != 2048 && data[i] != 0){
					ret += pow(2, i + 1);
					n++, data[i]--;
				}
			}
		}
		printf("%d", n);
	}
	system("pause");
}
C++:王老师有一个用于存放羊腿的神奇装置,这个装置呈一个桶的形状,深度无限大,其中每一层都可以存放一个羊腿 每次王老师往桶里放入羊腿时,只能放在最顶层羊腿的更上一层,而每次取出羊腿时也只能取出最顶层的羊腿 例如王老师的桶里依次存放了 3 个羊腿,质量分别为 1,2,3,那么此时王老师只能取出最顶层质量为 3 的羊腿,不能跨过 3 直接取质量为 2 和 1 的羊腿 现在王老师给这个装置了三个更神奇的功能——生成、合成与复制! 生成功能:王老师可以凭空生成一个质量为 1 的羊腿,并将它放在装置最顶层 合成功能:王老师可以将现在处于最顶层的两个羊腿合并成一个羊腿,并且羊腿质量不会发生消耗,并将合成后的羊腿放在装置最顶层 复制功能:王老师可以将现在处于最顶层的羊腿完美复制一份,并将它放在装置最顶层 例如王老师可以依次使用如下按钮:生成、生成、合成、复制、生成、合成合成 这样的操作可以凭空得到一个质量为 5 的羊腿 假设三种功能的能量消耗均一样,现在王老师知道最少需要使用多少次功能,可以凭空得到一个质量为 n 的羊腿? 并且王老师不浪费粮食,他不希望最终装置中还存在其他羊腿。 输入格式 输入第一行包含一个整数 T,表示询问次数 每行包含一个正整数 n,表示王老师要得到的羊腿质量 输出格式 对于每一次询问,输出王老师最少需要使用功能的次数 样例输入 1 5 5 99 33 12 87 样例输出 1 7 17 13 9 19
06-14
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值