step1:对于x,每有一个y < x , 那么贡献就是x - y
那么x的所有贡献就是 v * x - sum(y) , 其中v是小于x的数的个数,sum(y)是所有小于x的数的和。
step2:考虑排序,然后sum(y)就是一个前缀和,v也可以通过数的下标快速得到。直接枚举每个数进行计算即可。
具体细节看代码
def main():
n = int(input())
a = list(map(int, input().split()))
s = sum(a)
ans = 0
a.sort()
for i in range(n):
s -= a[i]
ans += s - a[i] * (n - i - 1)
print(ans)
if __name__ == "__main__":
main()
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int arraySize = scanner.nextInt(); // 读取数组大小
int[] numbers = new int[arraySize]; // 创建数组
long totalSum = 0, result = 0; // 初始化总和和结果
// 读取输入值并计算总和
for (int index = 0; index < arraySize; index++) {
numbers[index] = scanner.nextInt(); // 读取每个数字
totalSum += numbers[index]; // 累加总和
}
// 对数组进行排序
Arrays.sort(numbers);
// 基于排序后的数组计算结果
for (int index = 0; index < arraySize; index++) {
totalSum -= numbers[index]; // 减去当前数字
result += totalSum - (long) numbers[index] * (arraySize - index - 1); // 计算结果
}
// 输出最终结果
System.out.println(result);
}
}
在一个奇妙的世界里,每个人都有一个欢乐值d。
在奇妙世界聚会的时候,每一个人都要和所有来参加聚会的其他人打招呼。而当两个人打招呼的时候,整个会场的气氛值会发生变化。
假设现在有两个人是小塔和小堡,小塔的欢乐值是dA,Bob的欢乐值是dB,且dA>dB。当小塔和小堡打招呼的时候,小塔会因为自己的欢乐值比小堡高而感到开心,从而使整个会场的气氛值提高dA;而小堡会因为自己的欢乐值比小塔低而感到沮丧,从而使整个会场的气氛值降低dB。
本题属于以下题库,请选择所需题库进行购买
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册