1 solutions
-
0
题目大意
在一个购物APP中,有一个核心购物系统,该系统的接口被多个客户端调用。每个客户端有不同的请求数量,系统能接受的最大调用量是一个给定的值。要求设定一个阈值 value,如果某个客户端的请求量超过该阈值,则将其请求数量限制为这个阈值。我们的目标是求出最大的 value 值,确保所有客户端的请求总量不会超过核心购物系统的最大调用量。
思路
二分答案
要求在保证客户端请求的数量不会超过核心购物系统的最大调用量的情况下,使得阈值 尽可能大。一般该类问题可以尝试使用二分答案加验证答案正确性的方法尝试求解。
使用二分答案的方法,一般要考虑两个因素:
- 二分值(本题中为阈值)的变化,对模型整体的评估(本题中为)是具有单调性的
- 当确定二分值时,我们会借助该二分值去计算模型整体的评估值,该计算方法应该具有让人可以接收的复杂度
单调性
本题中的单调性依据题意应当是显而易见的:
- 当阈值 变小时,更多的客户端发起的请求量会被限制,因此总的请求量就会减小
- 当阈值 变大时,更少的客户端发起的请求量会被限制,许多客户端都能满足其发起的所有请求,于是总的请求量就会变大.
所以,答案随着阈值单调递增 , 可以使用二分答案!
答案验证
当获得了阈值 后,依据题意验证答案的时间复杂度是 ,其与二分答案所带来的时间复杂度叠加后,总的时间复杂度为 (二分答案引入的时间复杂度应当是 ,但是的最大范围与的范围是相同的,所以时间复杂度可以简化为该结果),这是该题能够接收的时间复杂度,因此二分答案的做法是可行的。
代码说明
整体代码流程
1.输入读取:
读取所有客户端的请求量,并存储在数组中。 读取最大调用量 th,作为验证的上限。
2.初步检查:
计算所有请求量的总和,如果总和小于等于最大调用量 th,直接输出 -1,表示不存在有效的阈值。
3.二分查找:
定义查找的区间,初始左边界为 -1,右边界为 100001。 进行二分查找,在每次迭代中计算中间值 mid 并使用 check 函数验证其合法性。 如果 check(mid) 返回 true,更新左边界为 mid,否则更新右边界。
4.输出结果:
最终输出 l,表示在满足条件下能达到的最大阈值。
时间复杂度:
代码
CPP
python
Java
Go
Js
- 1
Information
- ID
- 4
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 240
- Accepted
- 37
- Uploaded By