华为OD机试算法:计算礼品发放的最小分组数目

小明负责新年晚会礼品发放,需要按价格分组,每组最多两件且总价不超过上限。编写程序找出最小分组数,采用贪心算法,先按价格降序排序,每次取最大两个价格作为一组,直至只剩不足两个价格。
摘要由CSDN通过智能技术生成
题目描述

又到了一年的末尾,项目组让小明负责新年晚会的小礼品发放工作。

为使得参加晚会的同事所获得的小礼品价值相对平衡,需要把小礼品根据价格进行分组,但每组最多只能包括两件小礼品,并且每个分组的价格总和不能超过一个价格上限

为了保证发放小礼品的效率,小明需要找到分组数目最少的方案。

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

输入描述

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

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

输出描述

输出最小分组数量

用例

输入

5
1 2 5

输出

2

说明

题目解析

  • 1.

    首先,我们需要将输入的小礼品价格按照从大到小的顺序进行排序。

  • 2.

    然后,我们可以使用贪心算法来求解最小分组数量。具体步骤如下: a. 初始化一个变量 count 为 0,表示当前已经分组的数量。 b. 从排序后的价格列表中取出最大的两个价格,将它们作为一组,并将 count 加 1。 c. 继续从剩余的价格列表中取出最大的两个价格,将它们作为一组,并将 count 加 1。 d. 重复步骤 c,直到价格列表中的元素不足两个为止。

  • 3.

    最后,输出 count 作为最小分组数量。

JavaScript算法源码
 
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 2) {
    const max = lines[0] - 0;
    const arr = lines[1].split(" ").map(Number);

    console.log(getResult(max, arr));

    lines.length = 0;
  }
});

function getResult(max, arr) { 
  arr.sort((a, b) => a - b);

  let count = 0;

  let l = 0;  
  let r = arr.length - 1;  
 
  while (l < r) {
    const sum = arr[l] + arr[r]; 
    if (sum <= max) l++;
    r--;
    count++;
  }

  if (l === r) count++;

  return count;
}
Java算法源码
import java.util.Arrays;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int max = Integer.parseInt(sc.nextLine());
    Integer[] arr =
        Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);

    System.out.println(getResult(max, arr));
  }

  public static int getResult(int max, Integer[] arr) { 
    Arrays.sort(arr);

    int count = 0;
    int l = 0;  
    int r = arr.length - 1;  
 
    while (l < r) {
      int sum = arr[l] + arr[r];
 
      if (sum <= max) l++;
      r--;
      count++;
    }

    if (l == r) count++;

    return count;
  }
}
Python算法源码
 
maxPrice = int(input())
prices = list(map(int, input().split()))


 
def getResult():
 
    prices.sort()

    count = 0
    l = 0   
    r = len(prices) - 1   
 
    while l < r:
        sumPrice = prices[l] + prices[r]
 
        if sumPrice <= maxPrice:
            l += 1

        r -= 1
        count += 1

    if l == r:
        count += 1

    return count

 
print(getResult())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一剑破天门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值