AtCoder Context ABC 173 D - Chat in a Circle

本文章爲原創文章,未通過容許不得轉載
原題連接
運行要求
運行時間限制: 2sec
內存限制: 1024MB 數組

題目
你在玩一款叫作ATChat的網遊,結束遊戲教程後,和當時在場的N個玩家一塊兒去一個場景集合。給這N個玩家分配1到N的號碼。i號玩家(1<=i<=N)的友好度爲Ai。
N位玩家按照一個設定好的順序依次抵達現場。你爲了避免讓本身迷失,讓已經到達的玩家圍成一個圓圈,而且按照本身喜歡的順序安插他們到相應的位置。
除了最開始抵達的玩家之外,其餘的玩家在抵達的時候可以感到必定的溫馨度。這個溫馨度是順時針離這個玩家最近的玩家,逆時針離這個玩家最近的玩家,二者友好度中最小的那個友好度。
最開始抵達的玩家感覺到的溫馨度是0。微信

你可以決定N位玩家的抵達順序,並可以決定N位玩家在圓環中的安插位置。
請問可以讓全部玩家的溫馨度所能達到的最大值是多少。app

輸入前提條件spa

  • 全部的輸入都爲整數
  • 2 <= N <= 2 * 10 ^ 5
  • 1 <= Ai <= 10 ^ 9

輸入
輸入按照如下形式標準輸入3d

N
A1 A2 A3 A4 A5

輸出
N位玩家的溫馨度之和的最大值code


例1
輸入blog

4 
2 2 1 3

輸出排序

7

766a260a0019ea93e86e0588cc4db868.png
如圖所示,按照
4號玩家
2號玩家
1號玩家
3號玩家
的順序抵達,而且按照如圖所示的順序插入,能夠獲得最大的溫馨度的和值7教程

例2
輸入遊戲

7
1 1 1 1 1 1 1

輸出

6

讀懂題目
至關於有一個環,有一個一維數值ARR
把這個一維數組上的值Ai排到環上。

除了第一個排到環上的數之外
其餘的數都會取與它相鄰的數的最小值,加到最後的結果上
求最後結果的最大值

解題思路
首先,例1中能夠隱約感受到要從最大的數開始排。
名稱未設定.001.png
如圖所示
上面的綠色的圈表示從小到達的順序安排2,6
下面的藍色的圈表示從大到小的順序安排6,2

上面的狀況6的友好度被2稀釋
下面2在6的後面被派上,所以成功獲取了6的友好度

再次,咱們能夠發現若是按照由大到小的順序排列,某一個節點插入後,他的影響範圍會有兩次。下一個元素插在它的左邊,下下一個元素插入到它的右邊。
名稱未設定.002.png
如圖所示,元素8插入之後,它的下一個元素7排在它的左邊。下下一個元素6排在它的右邊。這樣的話8成了7和6的友好度。

名稱未設定.003.jpeg
如圖所示,給定數組9,8,7,6,3,2,2
9影響到了8
8影響到了7,6
7影響到了3,2
6影響到了2

這樣的話,咱們有了這麼一個思路
把數組由大到小排序。遍歷
第一個會影響第二個元素。
除了第一個之外,剩下的會影響到下一個,下下一個元素。而且加起來。
影響範圍到達數組末尾後,遍歷中止。
按照上面的思路遍歷數組9,8,7,6,3,2,2
名稱未設定.004.jpeg

代碼
方法一

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)

名稱未設定.005.png

總結
本題考查了對於題目中規律的抽取能力
從大到小排序
第1個節點會影響第二個節點
第2個節點之外的節點會影響,下面兩個節點

※ 另外,我會在個人微信我的訂閱號上推出一些文章,歡迎關注
二維碼.jpg

相關文章
相關標籤/搜索