LeetCode 2064. 分配给商店的最多商品的最小值

  • Post author:
  • Post category:其他




一、题目



1、题目描述

给你一个整数



n

n






n





,表示有



n

n






n





间零售商店。总共有



m

m






m





种产品,每种产品的数目用一个下标从 0 开始的整数数组

quantities

表示,其中

quantities[i]

表示第



i

i






i





种商品的数目。

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

一间商店 至多 只能有 一种商品 ,但一间商店拥有的商品数目可以为 任意 件。

分配后,每间商店都会被分配一定数目的商品(可能为 0 件)。用



x

x






x





表示所有商店中分配商品数目的最大值,你希望



x

x






x





越小越好。也就是说,你想 最小化 分配给任意商店商品数目的 最大值 。

请你返回最小的可能的



x

x






x








样例输入:


n = 6, quantities = [11,6]



样例输出:


3



2、基础框架

  • C语言 版本给出的基础框架代码如下:
int minimizedMaximum(int n, int* quantities, int quantitiesSize){
}



3、原题链接


LeetCode 2064. 分配给商店的最多商品的最小值



二、解题报告



1、思路分析




(

1

)

(1)






(


1


)





如果这个最大值已经确定了,为



x

x






x





,对于第



i

i






i





种商品数量为

quantities[i]

,可以分配给的最小的商店数目就是

quantities[i]/x

的上整。(想象一下如果我有7个商品,每个商店最多数量为3,则分配最小的商店数目是3)。




(

2

)

(2)






(


2


)





如果对于



x

x






x





确定的情况下,我们把所有的商品能够分配到的最少商店数目加起来,如果 小于等于



n

n






n





,说明在取



x

x






x





作为最大值的时候,商品能够分完。说明这里的



x

x






x





的是一个合法的解。




(

3

)

(3)






(


3


)





假如



x

x






x





合法,



x

+

1

x+1






x




+








1





必定合法(想象



x

x






x





无限大,那每种商品只分配到一个商店,必然是合法的)。




(

4

)

(4)






(


4


)





于是



x

x






x





满足单调性,所以我们可以二分枚举



x

x






x





的值,并且进行合法性判定。



2、时间复杂度

最坏时间复杂度



O

(

n

l

o

g

n

)

O(nlogn)






O


(


n


l


o


g


n


)







3、代码详解

bool check(int n, int* q, int m, int x) {
    int i;
    int ans = 0;
    for(i = 0; i < m; ++i) {
        ans += (q[i] + x - 1) / x;
        if(ans > n) {
            return false;
        }
    }
    return true;
}

int minimizedMaximum(int n, int* quantities, int quantitiesSize){
    int l = 1, r = 100000;
    int mid, x;

    while(l <= r) {
        mid = (l + r) / 2;
        if(check(n, quantities, quantitiesSize, mid)) {
            x = mid;
            r = mid - 1;
        }else {
            l = mid + 1;
        }
    }
    return x;
}



三、本题小知识

最小化最大值,或者最大化最小值,大概率是二分枚举答案。




四、加群须知

相信看我文章的大多数都是


「 大学生 」


,能上大学的都是


「 精英 」


,那么我们自然要


「 精益求精 」


,如果你还是


「 大一 」


,那么太好了,你拥有大把时间,当然你可以选择


「 刷剧 」


,然而,


「 学好算法 」


,三年后的你自然


「 不能同日而语 」




那么这里,我整理了


「 几十个基础算法 」


的分类,点击开启:





🌌《

算法入门指引

》🌌





如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

大致题集一览:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述





在这里插入图片描述





为了让这件事情变得有趣,以及


「 照顾初学者 」


,目前题目只开放最简单的算法


「 枚举系列 」


(包括:

线性枚举、双指针、前缀和、二分枚举、三分枚举

),当有 一半成员刷完


「 枚举系列 」


的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为


「 夜深人静写算法 」专家团


的一员。

不要小看这个专家团,三年之后,你将会是别人


望尘莫及


的存在。如果要加入,可以联系我,考虑到大家都是学生,


没有「 主要经济来源 」


,在你成为神的路上,


「 不会索取任何 」




🔥联系作者,或者扫作者主页二维码加群,加入刷题行列吧🔥





🔥让天下没有难学的算法🔥






C语言免费动漫教程,和我一起打卡!






🌞《

光天化日学C语言

》🌞







让你养成九天持续刷题的习惯






🔥《

九日集训

》🔥







入门级C语言真题汇总






🧡《

C语言入门100例

》🧡







组团学习,抱团生长






🌌《

算法零基础100讲

》🌌







几张动图学会一种数据结构






🌳《

画解数据结构

》🌳







竞赛选手金典图文教程






💜《

夜深人静写算法

》💜





版权声明:本文为WhereIsHeroFrom原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。