本文章爲原創文章,未通過容許不得轉載
原題連接
運行要求
運行時間限制: 2sec
內存限制: 1024MB 數組
題目
你在玩一款叫作ATChat的網遊,結束遊戲教程後,和當時在場的N個玩家一塊兒去一個場景集合。給這N個玩家分配1到N的號碼。i號玩家(1<=i<=N)的友好度爲Ai。
N位玩家按照一個設定好的順序依次抵達現場。你爲了避免讓本身迷失,讓已經到達的玩家圍成一個圓圈,而且按照本身喜歡的順序安插他們到相應的位置。
除了最開始抵達的玩家之外,其餘的玩家在抵達的時候可以感到必定的溫馨度。這個溫馨度是順時針離這個玩家最近的玩家,逆時針離這個玩家最近的玩家,二者友好度中最小的那個友好度。
最開始抵達的玩家感覺到的溫馨度是0。微信
你可以決定N位玩家的抵達順序,並可以決定N位玩家在圓環中的安插位置。
請問可以讓全部玩家的溫馨度所能達到的最大值是多少。app
輸入前提條件spa
輸入
輸入按照如下形式標準輸入3d
N A1 A2 A3 A4 A5
輸出
N位玩家的溫馨度之和的最大值code
例1
輸入blog
4 2 2 1 3
輸出排序
7
如圖所示,按照
4號玩家
2號玩家
1號玩家
3號玩家
的順序抵達,而且按照如圖所示的順序插入,能夠獲得最大的溫馨度的和值7教程
例2
輸入遊戲
7 1 1 1 1 1 1 1
輸出
6
讀懂題目
至關於有一個環,有一個一維數值ARR
把這個一維數組上的值Ai排到環上。
除了第一個排到環上的數之外
其餘的數都會取與它相鄰的數的最小值,加到最後的結果上
求最後結果的最大值
解題思路
首先,例1中能夠隱約感受到要從最大的數開始排。
如圖所示
上面的綠色的圈表示從小到達的順序安排2,6
下面的藍色的圈表示從大到小的順序安排6,2
上面的狀況6的友好度被2稀釋
下面2在6的後面被派上,所以成功獲取了6的友好度
再次,咱們能夠發現若是按照由大到小的順序排列,某一個節點插入後,他的影響範圍會有兩次。下一個元素插在它的左邊,下下一個元素插入到它的右邊。
如圖所示,元素8插入之後,它的下一個元素7排在它的左邊。下下一個元素6排在它的右邊。這樣的話8成了7和6的友好度。
如圖所示,給定數組9,8,7,6,3,2,2
9影響到了8
8影響到了7,6
7影響到了3,2
6影響到了2
這樣的話,咱們有了這麼一個思路
把數組由大到小排序。遍歷
第一個會影響第二個元素。
除了第一個之外,剩下的會影響到下一個,下下一個元素。而且加起來。
影響範圍到達數組末尾後,遍歷中止。
按照上面的思路遍歷數組9,8,7,6,3,2,2
代碼
方法一
N = int(input()) ARR = list(map(int,input().split())) def calculate(n, arr): endIndex = 0 ans = 0 arr = sorted(arr, reverse=True) for i in range(n): if i == 0: ans += arr[i] endIndex += 1 continue endIndex += 1 if endIndex >= n: break ans += arr[i] endIndex += 1 if endIndex >= n: break ans += arr[i] print(ans) calculate(N, ARR)
方法二
import heapq N = 4 ARR = [2, 2, 1, 3] N = 7 ARR = [1, 1, 1, 1, 1, 1, 1] N = int(input()) ARR = list(map(int,input().split())) def calculate(n, arr): result = [] arr = sorted(arr,reverse=True) heapq.heappush(result,-1 * arr[0]) ans = 0 for i in range(1,n): ans -= heapq.heappop(result) heapq.heappush(result,-1 * arr[i]) heapq.heappush(result, -1 * arr[i]) print(ans) calculate(N, ARR)
總結
本題考查了對於題目中規律的抽取能力
從大到小排序
第1個節點會影響第二個節點
第2個節點之外的節點會影響,下面兩個節點
※ 另外,我會在個人微信我的訂閱號上推出一些文章,歡迎關注