题意
这道题目的意思大致是:我们有一个数列,需要进行 n-1 次操作,每次操作我们可以选择其中一个元素 x ,再选择其他至少一个元素,让它们加上 x ,然后删除 x ,问最后剩下的那个元素最小是多少。
思路
这道题的解题中心主要在于:我们如何决定每个元素的删除顺序以及最后剩下的是哪一个元素。
首先,显然我们需要先删除较小的数,因为它能让其他数尽可能地不变大,这符合我们的最终目的。所以接下来我们只需要考虑最后剩下哪一个元素。
我们应当剩下最大的数。为什么?因为显然,负数能够让其他的数都变小,而正数我们则需要尽可能减小它的影响,所以相应地,我们应当尽可能扩大小的数的影响,减小大的数的影响,这也是为何我们需要先处理小的数,后处理大的数,最后剩下最大的数。
基于此,我们先进行一次从大到小的排序,而后遍历求解即可。
正解代码
java
import java.util.*;
public class Main{
static Scanner in = new Scanner(System.in);
public static void solve(){
int n = in.nextInt();
long []a = new long[n + 1];
for(int i = 1;i <= n;i++) a[i] = in.nextInt();
Arrays.sort(a, 1, n+1);
long all = 0;
long nxt = 0;
for(int i=1;i<=n;i++){
a[i] += all+nxt;
nxt = 0;
if(a[i] < 0){
all += a[i];
}
else{
nxt += a[i];
}
}
System.out.println(a[n]);
}
public static void main(String[] args){
int T = in.nextInt();
for(;T > 0;T--){
solve();
}
}
}
以上就是这篇文章的全部内容。