题目描述
用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或者2人组成,且1个人只能参加1个团队,计算出最多可以派出多少只符合要求的团队。
输入描述
- 第一行代表总人数,范围1-500000
- 第二行数组代表每个人的能力 数组大小,范围1-500000 元素取值,范围1-500000
- 第三行数值为团队要求的最低能力值,范围1-500000 输出描述 最多可以派出的团队数量
用例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
说明
3、5组成一队,1、7一队,9自己一队,2、6一队,输出4
用例3
输入
3
1 1 9
8
输出
1
说明
9自己一队,输出1
package odjava.分100;
import java.util.Arrays;
import java.util.Scanner;public class 求最多可以派出多少支团队_72 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.nextLine()); // 输入团队成员数量int[] capacities = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray(); // 输入团队成员的能力值int minCap = Integer.parseInt(sc.nextLine()); // 输入组队最低能力值// 调用方法获取最多可以派出的团队数量,并输出结果System.out.println(getResult(n, capacities, minCap));}/*** 计算最多可以派出的团队数量* @param n 团队成员数量* @param capacities 团队成员的能力值数组* @param minCap 组队最低能力值* @return 最多可以派出的团队数量*/public static int getResult(int n, int[] capacities, int minCap) {// 将团队成员的能力值数组升序排序Arrays.sort(capacities);int l = 0; // 左指针,指向能力值最低的成员int r = n - 1; // 右指针,指向能力值最高的成员// 记录最多可以派出的团队数量int ans = 0;// 单人组队:如果团队成员中有能力值大于等于最低能力值的成员,则可以单人组队while (r >= l && capacities[r] >= minCap) {r--; // 右指针向左移动,寻找下一个能力值小于最低能力值的成员ans++; // 团队数量加1}// 双人组队:从左右两端开始,尝试组队while (l < r) {int sum = capacities[l] + capacities[r]; // 计算两个团队成员的能力值之和// 如果两个团队成员的能力值之和大于等于最低能力值,则可以组队if (sum >= minCap) {ans++; // 团队数量加1l++; // 左指针向右移动,寻找下一个能力值高于当前最低能力值的成员r--; // 右指针向左移动,寻找下一个能力值低于当前最低能力值的成员} else {// 否则,将能力值低的成员剔除,换下一个能力值更高的成员l++; // 左指针向右移动,寻找下一个能力值高于当前最低能力值的成员}}return ans; // 返回最多可以派出的团队数量}
}