【华为OD题库-086】最多团队-Java

题目

题目描述:
用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>