編程題:尋找木頭


尋找木頭

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)

執行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM