[编程题]美
  • 热度指数:445 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
最后,Sεlιнα(Selina) 开始了选美大赛。 一如既往地,Sεlιнα 想最大化自己的愉悦度。她品味十分独特,对“美”有自己独到的见解。 她给每位经过层层选拔来到这一关的参赛男友都定义了一个帅气值 Sεlιнα 需要将这些参赛者排成一排,她对于这个排列的“美”值的定义是: 

其中 表示排列中第 个人的帅气值。特别地,当 时,有
她依旧想使自己获得最大的愉悦值,所以她要使这个排列的 值尽可能地大。聪明的你,快来告诉 Sεlιнα,这个最大的值是多少。 

输入描述:
第一行一个整数 ,表示有 个男友。
第二行 个整数,第 个数表示值 。 


输出描述:
输出共一行,一个整数,表示最大的  值。 
示例1

输入

5
7 3 15 12 8

输出

34
示例2

输入

7
-2 0 8 9 -5 3 10

输出

68

备注:


n = int(input())
r = list(map(int, input().split()))
r.sort()
ans = 0
for i in range(n//2):
    ans -=r[i]
for i in range((n+1)//2,n):
    ans +=r[i]
print(ans*2)


发表于 2026-06-07 20:20:30 回复(0)
题面要求对差值的绝对值累加,很显然的贪心思路就是“锯齿形”,可最大化差值的绝对值
例如:1 2 3 4 5 6 7,排序成:1726354
注意题面中的“当i=1时,有Ri−1=Rn”,第1个数要与最后一个数求差值,所以是个首尾相连的环形

 从上面的例子可以看到,锯齿的“高峰”分别减去左右的“低谷”,“低谷”分别被左右的“高峰”减去。
所以差值的绝对值是(较大的一半累加 - 较小的一半累加) ×2

注意当n是奇数时我们要考虑中位数的情况:
上述构造中可以看到,中位数一侧更大,另一侧更小
所以它减去更小的数,又被更大的数减去正负抵消,所以计算时直接跳过它。

核心代码如下(数据范围108×105×2=2×1013所以ans必须开long):
Arrays.sort(r);
long ans = 0;
for (int i = 0; i < n / 2; i++) ans -= r[i];
for (int i = (n + 1) / 2; i < n; i++) ans += r[i];
System.out.println(ans * 2);
(小技巧:n/2下取整,(n+1)/2上取整,当n偶数时它们相等,当n奇数时它们差1,免判断自动跳过中位数)
发表于 2026-06-07 03:46:48 回复(0)

问题信息

难度:
2条回答 157浏览

热门推荐

通过挑战的用户

查看代码