题目
示例1
input:
5
3 1 5 7 9
8
output:
3
示例2
input:
5
3 1 5 7 9
4
output:
4
示例3
input:
9
3 1 5 7 8 9 12 15 20
15
output:
4
1 3 5 7 8 9 12 15 20
分析
要点:每个团至多2人,找出最多的组团个数。个人能力达到要求的单独成团,剩下均是需要组团的,找出最大成员组合数。
考虑双指针
- 存入数组,升序排序
- 双指针分别指向开始和末尾,向中间移动,末尾的单个元素只要是>=要求的能力的,往前移动,开头的第一元素若>=要求的能力的,直接返回数组长度,即为最大组合数
- 末尾元素<要求的能力的,和前指针元素相加
1. >=要求的能力,后指针前移一位,前指针后移一位
2. <要求的能力,前指针后移一个,重复步骤3,在相加判断 - 结束标志:后指针 <= 前指针
- 最终判断前指针和后指针相等的情况,若这个元素 >=要求的能力,这res+1
题解
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int[] arr = new int[num];
for (int i = 0; i < num; i++) {
arr[i] = in.nextInt();
}
int power = in.nextInt();
Arrays.sort(arr);
int left = 0;
int right = arr.length - 1;
int res = 0;
while (left < right) {
if (arr[0] >= power) {
res = num;
break;
}
if (arr[right] >= power) {
res++;
right--;
} else {
if (arr[right] + arr[left] >= power) {
res++;
right--;
left++;
} else {
left++;
}
}
}
if (left == right) {
res++;
}
System.out.println(res);
}
}
参考
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();
long[] ability = new long[n];
for (int i = 0; i < n; i++) {
ability[i] = in.nextInt();
}
long limit = in.nextInt();
Arrays.sort(ability);
int l = 0, r = n - 1;
int ans = 0;
while (l < r && ability[r] >= limit) {
ans++;
r--;
}
while (l < r) {
if (ability[l] + ability[r] >= limit) {
ans++;
l++;
r--;
} else {
l++;
}
}
if (l == r) {
if (ability[r] > limit) {
ans++;
}
}
System.out.println(ans);
}
}
https://blog.csdn.net/weixin_52908342/article/details/135375285