■題目描述
有乙個數字遊戲叫做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×,
int index)
if(index >0)
merge
(array, times, index -1)
;}intmain()
return0;
}
迴圈方法
#include
#include
#include
using
namespace std;
intmain()
else}}
printf
("%d"
, n);}
system
("pause");
}
最少乘法次數
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述給你乙個非零整數,讓你求這個數的n次方,每次相乘的結果可以在後面使用,求至少需要多少次乘。如24 2 2 22 第一次乘 22 22 24 第二次乘 所以最少共2次 輸入第一行m表示有m 1 m 100 組測試資料 每一組測試資料...
出現次數最少的數
閒來無事,想著把ccf刷到三百分 問題描述 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的乙個。輸入格式 輸入的第一行只有乙個正整數n 1 n 1000 表示數字的個數。輸入的第二行有n個整數s1,s2,sn 1 si 10000,1 i n 相鄰的數用空格分隔。輸...
最少交換次數
第乙個問題 現在想通過交換相鄰元素的操作把乙個給定序列交換成有序,最少需要交換的次數是多少?比如3 1 2 4 5需要最少交換2次。答案 需要交換的最少次數為該序列的逆序數。證明 可以先將最大數交換到最後,由於是相鄰兩個數交換,需要交換的次數為最大數後面的數的個數 可以看做是最大數的逆序數 然後,交...