【华为OD题库-062】计算礼品发放的最小分组数目-java

题目

又到了一年的末尾,项目组让小明负责新年晚会的小礼品发放工作。为使得参加晚会的同时所获得的小礼品价值相对平衡,需要把小礼品根据价格进行分组,但每组最多只能包括两件小礼品,并且每个分组的价格总和不能超过一个价格上限。为了保证发放小礼品的效率,小明需要找到分组数目最少的方案。

你的任务是写一个程序,找出分组数最少的分组方案,并输出最少的分组数目。
输入

第一行数据为分组礼品价格之和的上限

第二行数据为每个小礼品的价格,按照空格隔开,每个礼品价格不超过分组价格和的上限
输出

输出最小分组数量
示例1:
输入:

5

1 2 5
输出:

2

思路

最多只能分两个礼品,要求最小方案数。先将输入nums按从小到大排序,以数据为例:1 2 3 3 5 8(假设不超过8),让left指向第一个礼物1,right指向最后一个礼物8

计算当前礼物价值:8+1=9,超过限制,8只能单独分一组,right- -,res=1

left=1,right=5,和为6,可以分为一组,left++,right- -,res=2

left=2,right=3,可以分为一组,left++,right- -,res=3

left=3,right=3,指向的同一个值,单独分一组即可,res=4

上述过程可以用队列或者双指针模拟实现。

题解

java 复制代码
package hwod;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

public class GiftGroup {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int max = sc.nextInt();
        sc.nextLine();
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        System.out.println(giftGroup(nums, max));
        System.out.println(giftGroup2(nums, max));
    }

    private static int giftGroup(int[] nums, int max) {
        Arrays.sort(nums);
        LinkedList<Integer> queue = new LinkedList<>();
        for (int num : nums) {
            queue.addLast(num);
        }
        int res = 0;
        while (queue.size() > 1) {
            int cur = queue.peekLast() + queue.peekFirst();
            queue.removeLast();
            if (cur <= max) {
                queue.removeFirst();
            }
            res++;
        }

        return queue.isEmpty() ? res : res + 1;
    }

    private static int giftGroup2(int[] nums, int max) {
        Arrays.sort(nums);
        int left = 0, right = nums.length - 1, res = 0;
        while (left < right) {
            int cur = nums[right] + nums[left];
            right--;
            res++;
            if (cur <= max) {
                left++;
            }
        }

        return left==right?res+1:res;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关推荐
腻害兔5 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说10 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199411 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了12 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品12 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘12 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记12 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端