思路
根据贪心思想,数组 的元素尽量大,而数组
的元素尽量小,并且不难想到,
的长度应始终满足
。
不妨先对数组进行排序(假设从小到大),然后 从后面开始选择,
从数组前面开始选择。然后枚举数组
长度,求和比较是否满足
即可。为了加快求和的速度,用前缀和即可。
最后时间复杂度为 ,空间复杂度为
。
参考代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n + 1];
long[] pre = new long[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = in.nextInt();
}
Arrays.sort(a);
for (int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + a[i];
}
int lenA = 1;
boolean flag = false;
while (2 * lenA + 1 <= n) {
long sumA = pre[n] - pre[n - lenA];
long sumB = pre[lenA + 1];
if (sumB < sumA) {
flag = true;
break;
}
lenA++;
}
System.out.println(flag ? lenA : -1);
}
}