本文章为原创文章,未通过容许不得转载
原题连接
运行要求
运行时间限制: 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个节点之外的节点会影响,下面两个节点
※ 另外,我会在个人微信我的订阅号上推出一些文章,欢迎关注