尋找木頭
JD 2022 校招
時問限制:3000MS
記憶體限制:589824KB
題目描述:
小明和他的夥伴發現了一堆木頭排成了一排,一共n個,假設排列在x軸上,最左端的木頭的座標是0,最右端木頭的座標是n,他們想拿走裡面最重和最輕的木頭各一個,但是他們並不知道是這一堆裡的哪一個,因此他們需要挨個測量。現在他們在這排木頭的兩端,一個人在座標0,一個人在座標n,他們只能按順序測量,即在0位置的人只能依次測量0.1.2,3然後到n,在n位置的人則相反。現在你已經知道每個木頭的重量,你可以指揮他們是否繼續測顯,問兩個人一共最少需要多少次測量就可以找到最重和最輕的木頭。
輸入描述:
第一行一個整數n,1<=n<=1000
第二行n個空格隔開的整數,表示木頭的重層,某中任意一個數大小範圍是(0.10000].
輸出描述:
個整數,表示最少需要測量的次數。
樣例1
輸入
5
1 5 4 3 2
輸出
2
解釋:從左測量1,然後測量5,就可以了
樣例2
輸入:
8
2 1 3 4 S 6 8 7
輸出:
4
解釋:從左測量2然後測量1,從石測量然後測量8
題解:
一開始我的思路是
找到陣列的最大值最小值距離兩端的最小距離,如果都距離一端近,就輸出兩個最小距離的最大值(如樣例1);
如果分別距離首尾近則輸出兩個最小距離的和(如樣例2);
但如果是最大值最小值都很靠正中間,最大值最小值的之間距離小於最大值最小值距離兩邊的距離輸出兩個最小距離的最小值加上兩個最大值最小值之間的距離。
想到這裡的時候就不對勁了,換一個思路:
還是找陣列的最大值最小值距離兩端的最小距離,還是上面的判斷條件,
但是需要解決上面分類複雜的問題,
如果最大值和最小值之間的距離很大,則是兩邊輸出,如果最大值和最小值之間的距離(abs(maxidx - minidx))很小,那麼適合單邊距離的最大值。
那這個距離的閾值怎麼找的呢?
首先如何判斷最大值最小值之間的距離是大還是小:
如果最大值最小值之間的距離(abs(maxidx - minidx))大於最大值最小值距離兩邊的最小值,那麼適合兩邊距離的和;
如果最大值最小值之間的距離(abs(maxidx - minidx))小於最大值最小值距離兩邊的最小值,那麼適合單邊距離的最大值;
到這裡思路就明朗起來了。
程式碼如下:
N = int(input())
list = input().split(' ')
maxidx = list.index(max(list)) # 最大值索引
minidx = list.index(min(list)) # 最小值索引
len = abs(maxidx -minidx) - 1 #最小值和最大值中間的元素個數(左開右開)
if len < N/2:
out = min(max(maxidx, minidx) + 1, max(N-maxidx, N-minidx))
else:
out = N - len
print(out)
執行效果: