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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章