题目
题目描述:
用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或2人组成,且1个人只能参加1个团队,请计算出最多可以派出多少支符合要求的团队?
输入描述:
5
3 1 5 7 9
8
第一行数组代表总人数,范围[1,500000]
第二行数组代表每个人的能力,每个元素的取值范围[1,500000],数组的大小范围[1,500000]
第三行数值为团队要求的最低能力值,范围[1,500000]
输出描述:
3
最多可以派出的团队数量
示例1:
输入
5
3 1 5 7 9
8
输出
3
说明
3,5组成—队,1,7组成一队,9自己一个队,故输出3
示例2:
输入
7
3 1 5 7 9 2 6
8
输出
4
说明
1、7组成—队,3、5—队,2、6—队,9自己一队,输出4
示例3:
输入
3
1 1 9
8
输出
1
说明
1、9组成—队或者9自己—队输出1
思路
双指针解法:
将输入nums从小到大排序,i指向起始位置0,j指向最后一个位置nums.length-1
先将j左移,直到nums[j]<target,大于target的均可以单独一组。
接下来,将nums[j]+nums[i]记作t,看其是否能组成一队?
如果t大于等于target,说明能组一队,此时将i++,j–,寻找下一组
如果t小于target,说明能力不够,nums[j]和nums[i]不能组队,此时将i右移调大,使总能力更大才有可能组队
最后统计总的组队数即可
题解
package hwod;
import java.util.Arrays;
import java.util.Scanner;
public class MostTeam {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
int min = sc.nextInt();
System.out.println(mostTeam(nums, min));
}
private static int mostTeam(int[] nums, int min) {
Arrays.sort(nums);
int res = 0;
int i = 0, j = nums.length - 1;
while (j >= 0 && nums[j] >= min) {
j--;
res++;
}
if (j < 0) return res;//每一个都大于等于min,直接单独组队即可
while (i < j) {
int t = nums[i] + nums[j];
if (t >= min) {
res++;
j--;
}
i++;
}
return res;
}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
说明
本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。