【题目描述】

给你一个整数 n ,表示有 n 间零售商店。总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 quantities[i] 表示第 i 种商品的数目。

你需要将 所有商品 分配到零售商店,并遵守这些规则:

  • 一间商店 至多 只能有 一种商品 ,但一间商店拥有的商品数目可以为 任意 件。
  • 分配后,每间商店都会被分配一定数目的商品(可能为 0 件)。用 x 表示所有商店中分配商品数目的最大值,你希望 x 越小越好。也就是说,你想 最小化 分配给任意商店商品数目的 最大值 。

请你返回最小的可能的 x 。

示例 1:

输入:n = 6, quantities = [11,6]
输出:3
解释: 一种最优方案为:
- 11 件种类为 0 的商品被分配到前 4 间商店,分配数目分别为:2,3,3,3 。
- 6 件种类为 1 的商品被分配到另外 2 间商店,分配数目分别为:3,3 。
分配给所有商店的最大商品数目为 max(2, 3, 3, 3, 3, 3) = 3 。

示例 2:

输入:n = 7, quantities = [15,10,10]
输出:5
解释:一种最优方案为:
- 15 件种类为 0 的商品被分配到前 3 间商店,分配数目为:5,5,5 。
- 10 件种类为 1 的商品被分配到接下来 2 间商店,数目为:5,5 。
- 10 件种类为 2 的商品被分配到最后 2 间商店,数目为:5,5 。
分配给所有商店的最大商品数目为 max(5, 5, 5, 5, 5, 5, 5) = 5 。

示例 3:

输入:n = 1, quantities = [100000]
输出:100000
解释:唯一一种最优方案为:
- 所有 100000 件商品 0 都分配到唯一的商店中。
分配给所有商店的最大商品数目为 max(100000) = 100000 。

提示:

  • m == quantities.length
  • 1 <= m <= n <= 105
  • 1 <= quantities[i] <= 105

【题目分析】

如果n = m,商店数和商品种类一样多,很显然分配商品数目的最大值即为quantities中商品数最大的值;
    如果n>m,quantities中商品数最大的值肯定也是满足分配条件的值,但是不一定是最优的值;
    那么最优的值一定在1和最大的值之间,且刚好使分配的商店数目等于n,采用遍历的方法必定可以获取最优解,但是这种解法复杂度O(n),会超时;
    一般地,
    给定分配商品数目的最大值x,所分配的商店数目为f,那么随着x的增大,f必定减小(严格来说是非增),即f与x存在单调关系,
    那很容易想到看可以采用二分法去查找最优解;
    求第一个满足<=n的x;
    即搜索左边界,最后终止条件是left == right,判断条件为left < right,如果判断条件为left<=right,由于right=mid,会出现死循环;
    右边界是可以取到等号的,所以右边界的更新为right=mid;
    左边界不取等号,所以为left=mid+1;

二分搜索算法,思路很简单,但是细节是魔鬼!!!关键要通过实战来体会。

【代码如下】

class Solution {
public:int Clac(vector<int>& q, int m, int x){int res = 0;for (int i = 0; i < m; ++i) {res += (q[i] % x == 0 ? q[i] / x : (q[i] / x + 1));}return res;}int minimizedMaximum(int n, vector<int>& quantities) {int res = 0;sort(begin(quantities), end(quantities));int m = quantities.size();int left = 1; // 左边界可以取到,这里应该是一个可能的目标值int right = quantities[m - 1] + 1; // 由于终止条件为left < right,即右侧取不到,那么初始值right应该是一个比可能的目标值大的值;int mid = 0;cout << Clac(quantities, m, 12) <<endl;while (left < right) {mid = left + (right - left) / 2;if (Clac(quantities, m, mid) > n) { // 左边界不取等号,所以更新时+1;left = mid + 1;} else { // 可以取等号,所以更新值=midright = mid;}}return left;}
};

[Leetcode]5920. 分配给商店的最多商品的最小值相关推荐

  1. 5920. 分配给商店的最多商品的最小值

    5920. 分配给商店的最多商品的最小值 给你一个整数 n ,表示有 n 间零售商店.总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 quanti ...

  2. LeetCode 2064. 分配给商店的最多商品的最小值(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示有 n 间零售商店. 总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 qua ...

  3. 2021.11.7 力扣-周赛-分配给商店的最多商品的最小值

    题目描述: 给你一个整数 n ,表示有 n 间零售商店.总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 quantities[i] 表示第 i 种 ...

  4. 收到在微软商店购买的商品

    今天收到了在微软商店购买的商品,送货速度真快,20号下的订单,今天就拿到了,这么快就从美国通过UPS快递到国内,现在的物流越来越发达了.     我购买的商品是:     1.WM USB Power ...

  5. LeetCode MySQL 1777. 每家商店的产品价格(行列转换)

    文章目录 1. 题目 2. 解题 1. 题目 表:Products +-------------+---------+ | Column Name | Type | +-------------+-- ...

  6. LeetCode 2071. 你可以安排的最多任务数目(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你 n 个任务和 m 个工人.每个任务需要一定的力量值才能完成,需要的力量值保存在下标从 0 开始的整数数组 tasks 中,第 i 个任务需要 tas ...

  7. LeetCode 1655. 分配重复整数(回溯)

    文章目录 1. 题目 2. 解题 2.1 回溯 1. 题目 给你一个长度为 n 的整数数组 nums ,这个数组中至多有 50 个不同的值. 同时你有 m 个顾客的订单 quantity ,其中,整数 ...

  8. Leetcode刷题149. 直线上最多的点数

    给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上. 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | |        o |     o | ...

  9. Python ELM模型预测美国10个商店3049个商品销售量 ANN人工神经网络

    问题描述 美国有10个商店,每个商店有3049个商品,统计了1914天内各个商品的价格和销售数量,以及每天的属性(节日,打折活动等),通过构建非时序模型预测1914天-1941天各个商品销售数量,使用 ...

最新文章

  1. OpenCV Hough Line变换
  2. 自己设计大学排名-数据库实践
  3. Github高赞的YOLOv5引发争议?Roboflow和开发者这样说
  4. ElasticSearch ected map for property [fields] on field [subject_id] but got a class java.lang
  5. 在虚拟机中安装gentoo简化步骤(基于官方手册)
  6. Tensorflow get_variable和Varialbe的区别
  7. java语句梗_请大神给我解释一下下面这句JAVA语句的意思
  8. 英文聊天常用缩写单词
  9. 【LeetCode】49. Group Anagrams
  10. gradle配置阿里Maven仓库
  11. 《CSAPP》(第3版)答案(第十一章)
  12. 第二次作业:网易云音乐案例分析
  13. 正则表达式转NFA,DFA,最小化DFA
  14. jquery判断起止时间大小和非空
  15. 位运算—统计文本文件中汉字的个数
  16. POI解析Word中文API
  17. mac 下安装编译 yasm
  18. 【精】如何搭建NPS进行内网穿透
  19. 市场红利!这家公司4D成像雷达取得重大技术突破
  20. revit土建工具丨Revit中体量创建斜墙体的方法

热门文章

  1. flyme8会更新Android版本吗,魅族X8Flyme8 刷机包(最新固件升级包安卓8.0)
  2. 4/23 复制链接、 微信扫码分享 、 微博,qq及空间的分享组件
  3. AI怎样在未来的医疗保健业中大显身手?
  4. RTR4读书笔记 Chapter8 Light and Color
  5. 软件项目开发业界通常报价和收费方式
  6. Sectigo 网络安全证书 / 传输加密
  7. 基于stm32f103zet6之NRF905无线模块的学习
  8. 哈工大 计算机系统 二进制炸弹实验报告
  9. 鼠标烟雾拖尾(含代码)
  10. 威纶通触摸屏定时触发动作