如果要在n個資料中挑選出第一大和第二大的資料(要求輸出資料所在位置和值),使用什麼方法比較的次數最少?我們可以從體育錦標賽中受到啟發。
如圖【1.png】所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼…直到決出第一名。
第一名輸出後,只要對黃色標示的位置重新比賽即可。
下面的**實現了這個演算法(假設資料中沒有相同值)。
**中需要用乙個陣列來表示圖中的樹(注意,這是個滿二叉樹,不足需要補齊)。它不是儲存資料本身,而是儲存了資料的下標。
第乙個資料輸出後,它所在的位置被標識為-1
填**程式沒什麼太多技巧,看懂程式就好了,這是考查資料結構的知識,只是**一長,剛看起來有點蒙。
#include
#include
#include
//重新決出k號位置,v為已輸出值
void pk(int* a, int* b, int n, int k, int v)
if(b[k1]==v)
pk(a,b,n,k1,v);
else
pk(a,b,n,k2,v);
//重新比較
if(b[k1]<0)
if(b[k2]<0)
if(b[k1] > b[k2]) //填空
b[k] = b[k1];
else
b[k] = b[k2];
}//對a中資料,輸出最大,次大元素位置和值
void f(int* a, int len)
//從最後乙個向前處理
for(i=2*n-1-1; i>0; i-=2)
else
}//輸出樹根
printf("%d : %d\n", b[0], a[b[0]]);
//值等於根元素的需要重新pk
pk(a,b,2*n-1,0,b[0]);
//再次輸出樹根
printf("%d : %d\n", b[0], a[b[0]]);
free(b);
}int main()
; f(a,9);
}
第五屆藍橋杯省賽C A組 神奇算式
由4個不同的數字,組成的乙個乘法算式,它們的乘積仍然由這4個數字組成。比如 210 x 6 1260 8 x 473 3784 27 x 81 2187 都符合要求。如果滿足乘法交換律的算式算作同一種情況,那麼,包含上邊已列出的3種情況,一共有多少種滿足要求的算式。請填寫該數字,通過瀏覽器提交答案,...
藍橋杯第五屆省賽C C B組個人題解
列舉 include using namespace std intmain if temp 82.3 break 遞推公式即可 include using namespace std intmain for int i 2 i 11 i f i f i 1 2 1 cout bfs搜尋到最後情況即...
第九屆藍橋杯省賽C B組第五題
以下 可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o n 的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。include int quick select int a int l,int r,int k int i l,j r while i j while...