16簡單不看 藍橋杯之錦標賽(程式填空題)

2021-10-02 11:35:48 字數 1220 閱讀 2700

如果要在n個資料中挑選出第一大和第二大的資料(要求輸出資料所在位置和值),使用什麼方法比較的次數最少?我們可以從體育錦標賽中受到啟發。

如圖【1.png】所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼…直到決出第一名。

第一名輸出後,只要對黃色標示的位置重新比賽即可。

下面的**實現了這個演算法(假設資料中沒有相同值)。

**中需要用乙個陣列來表示圖中的樹(注意,這是個滿二叉樹,不足需要補齊)。它不是儲存資料本身,而是儲存了資料的下標。

第乙個資料輸出後,它所在的位置被標識為-1

#include

//重新決出k號位置,v為已輸出值

voidpk(

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(a[b[k1]

]> a[b[k2]])

// if(______________________) //填空

b[k]

= b[k1]

;else

b[k]

= b[k2];}

//對a中資料,輸出最大,次大元素位置和值

voidf(

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 C A組第五題 錦標賽

如果要在n個資料中挑選出第一大和第二大的資料 要求輸出資料所在位置和值 使用什麼方法比較的次數最少?我們可以從體育錦標賽中受到啟發。如圖 1.png 所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼 直到決出第一名。第一名輸出後,只要對黃色標示的位置重新比賽即可。下面的 實現了這個...

藍橋盃國賽之階乘位數

9的階乘等於 362880 它的二進位制表示為 1011000100110000000 這個數字共有19位。請你計算,9999 的階乘的二進位制表示一共有多少位?注意 需要提交的是乙個整數,不要填寫任何無關內容 比如說明解釋等 思路 把每乙個數都用2的x的方,然後把2的指數加起來就可以了,最後取整 ...

藍橋杯 16省賽 A9 交換瓶子 找閉環

交換瓶子 有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正...