藍橋杯第五屆省賽C C A組第五題 錦標賽

2021-07-30 05:51:57 字數 1093 閱讀 5213

如果要在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...