巧用二分法

二分法查找源码 二分法查找和顺序查找 排序后二分法 立即下载
题意:有N个城市,每个城市有Ai个人。
现在要开始投票,每个人有一张票。
作为领导者,你有B个箱子,你必须要将这B个箱子分发到N个城市去,每个城市至少需要一个箱子。
每个人都必须要投票,不能弃票,也就是说要把票丢进箱子里去(每个城市有Ai张票)。
现在问你,怎么分配这B个箱子才能使这些所有箱子里中票数最大的那个箱子里的票最少?
1<=N<=500,000,N<=B<=2,000,000,1<=Ai<=5,000,000。

思路:若每个城市都先分得一个箱子,那么目前的答案就是max(Ai(1<=i<=n))。所以,我们必须要给最大值的那个城市还需要至少分配一个箱子,那么答案肯定不再是那个城市(也有可能有某个城市的人数跟该城市人数一样,那么答案还是没变)。
接下来如果你还有箱子,你肯定要给次大值的那个城市至少再分配一个箱子;
接下来如果你还有箱子,你肯定要给次次大值的那个城市至少再分配一个箱子;
接下来如果你还有箱子,你肯定要给次次次大值的那个城市至少再分配一个箱子;
接下来如果你还有箱子,你肯定要给次次次次大值的那个城市至少再分配一个箱子;
。。。
直到什么时候呢?
直到原先那个最大值城市的票数的一半(奇数需要再加1)大于等于了你刚刚从大到小排列的城市的那个票数,为什么?
因为那个城市的后面的票数肯定小于等于那个城市,那么这些城市中没有一个票数是比那个最大值城市的票数的一半还要大,也就是说当前状态下,所有城市中,原先那个最大值城市的票数的一半成了当前最大值。

解题:你想到了什么?——二分!
我们二分票数,票数范围是1到某个城市的最大票数。
记l=1, r=max,那么mid=(1+max)/2;
假设mid就是答案,那么我们需要统计一下一共需要几个箱子。

int num = 0;

for (int i = 1; i <= n; i++)

{

if (a[i] % mid) num += a[i] / mid + 1;

else num += a[i] / mid;

}

那么最后需要num个箱子,但是我们有B个箱子,所以需要比较一下。
如果num>B,说明我们需要的箱子不够,也就是说票数不小于mid值的那些城市中有些城市分不到足够的箱子,所以,我们的最终答案肯定是大于num的。那么二分范围落在[mid + 1, max]。
如果num<=B,说明我们需要的箱子很够,也就是说票数不小于mid值的那些城市中所有城市都能分到足够的箱子,所以,我们的最终答案肯定是小于等于num的。那么二分范围落在[1, mid]。
然后继续二分,直到最终的范围l>=r为止结束。
利用二分法VBA解方程 精确解高次方程的根是利用VBA自定义函数 立即下载

相关推荐

北大ACM、NOIP课程二分法

北大ACM、NOIP课程二分法 北大ACM、NOIP课程二分法 北大ACM、NOIP课程二分法

python摩尔投票法和二分法

摩尔投票法和二分法摩尔投票法leetcode(力扣)算法实现如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 摩尔投票法 摩尔投票法是对于无序数组而言的,把无序数组看作一堆选票,如果数组无序,那么就让不同的数相互抵消(一票抵消一票),最后剩下的就是多的数(选出得票最多的)。

qq_56630261的博客 802

面试题(C++方向)

第一篇 1、在函数内定义一个字符数组,用gets函数输入字符串的时候,如果输入越界,为什么程序会崩溃? 答:因为gets无法截断数组越界部分,会将所有输入都写入内存,这样越界部分就可能覆盖其他内容,造成程序崩溃。 2、C++中引用与指针的区别 答:联系:引用是变量的别名,可以将引用看做操作受限的指针; 区别: 1) 指针是一个实体,而引用仅是个别名; 2)引用只能在定义时必须初...

Xiongchao99的博客 3万+

Spicy Restaurant (暴力多源bfs)

Link 题意: 有n个城市,每个城市有个辣度,给你个图,有q次询问求某个点开始,忍耐度为w,求最近辣度<=w的最短路,边权为1。 q<=5e5 n<=1e5   m<=1e5 wi,w<=100q<=5e5 \space n<=1e5 \space\space \space m<=1e5 \space wi,w<=100q<=5e5 n<=1e5  &nb

goto_1600的博客 619

VB:二分法查找

【代码】VB:二分法查找。

wanglongjiayou的博客 620

写了个二分法查找函数

今日有csdn的网友问到这个问题,所以写了这个函数,如下:二分法查找函数功能:在数组中查找指定的值返回:若查到指定值则返回相应的索引,否则返回-1程序:by Tang 22:06 2005-4-27Function vbBinarySearch(vb_Array() As Long, ByVal vb_Find As Long) As Long    Dim SearchMin As Lo

唐古拉山的专栏 5479

一道巧用二分法的题目

巧用二分法解决问题

qq_50438796的博客 277

巧用二分法_leetcode刷题总结

二分法巧解题 谈到二分法,你会想到啥? 嗯,本人作为一名非ACMer的小菜鸡,一开始的时候,脑子想到的就是上过的算法课上老师说可以用二分法在有序数组里面进行快速查找,并且又一个十分显著的特征,时间复杂度是log2n 量级的。 记忆中二分查找的代码模版: public void find(int[] num,int target){ int left = 0,right = num.lenth;...

zhuzhuxia183的博客 440

巧用二分法求平方根问题

注意:这里一定取右中位数,如果取左中位数,代码可能会进入死循环。这个问题留给大家思考,有答案的小伙伴可以评论区留言哦~分析:如果取中点为左中位数,你看到死循环发生在。需要说明的是: 这里。

Buy0515的博客 263

[week4]TT的神秘礼物——二分法巧用复杂一点版)

目录题意InputOutput输入样例输出样例提示分析总结代码 题意 TT 是一位重度爱猫人士,每日沉溺于 B 站上的猫咪频道。 有一天,TT 的好友 ZJM 决定交给 TT 一个难题,如果 TT 能够解决这个难题,ZJM 就会买一只可爱猫咪送给 TT。 任务内容是,给定一个 N 个数的数组 cat[i],并用这个数组生成一个新数组 ans[i]。新数组定义为对于任意的 i, j 且 i != j...

明哲天翊的博客 228

[week4]四个数列——二分法巧用

目录题意InputOutput输入样例输出样例提示分析总结代码 题意 ZJM 有四个数列 A,B,C,D,每个数列都有 n 个数字。ZJM 从每个数列中各取出一个数,他想知道有多少种方案使得 4 个数的和为 0。 当一个数列中有多个相同的数字的时候,把它们当做不同的数对待。 请你帮帮他吧! Input 第一行:n(代表数列中数字的个数) (1≤n≤4000) 接下来的 n 行中,第 i 行有四个数...

明哲天翊的博客 314

【经典题目】分割数组的最大值——巧用二分法

来源于竞赛 难度H 二分法的思路:存在一个bound,大于或小于这个bound都无法满足条件。查找这个bound 分割数组的最大值 这道题有一个很有意思的方法,就是二分方法。之所以能采用二分去思考的本质原因在于:具有单调最优的性质:如果最大值为 t 可以满足条件划分,那么最大值为 t+1也可以,所以就直接二分最大值 t,找到最小满足条件的 t 即可。 class Solution: de...

遍地跑小鸡的博客 491

LeetCode 33 Search in Rotated Sorted Array 巧用递归二分法查找改造

Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to

gx262091291的专栏 671

巧用二分法实现数学开方(sqrt)运算

二分查找时间复杂度计算与分析implement int sqrt(int x). Compute and return the square root of x.public int sqrt(int x) { int low = 0; int high = x; while (low <= high) { long mid

ZhangRui的博客 1万+

二分法求根号二的近似值_巧用顺口溜熟记初中数学公式和规律(二)

有理数的加法运算同号两数来相加,绝对值加不变号。异号相加大减小,大数决定和符号。互为相反数求和,结果是零须记好。【注】“大”减“小”是指绝对值的大小。有理数的减法运算减正等于加负,减负等于加正。有理数的乘法运算符号法则同号得正异号负,一项为零积是零。合并同类项说起合并同类项,法则千万不能忘。只求系数代数和,字母指数留原样。去、添括号法则去括号或添括号,关键要看连接号。扩号前面是正号,去添括号不变号...

weixin_32095133的博客 2589

巧用Local Overrides与二分法:高效定位并修复前端样式冲突的实战指南

本文详细介绍了如何利用Chrome的Local Overrides功能与二分法高效定位和修复前端样式冲突。通过实战案例和工具推荐,帮助开发者快速解决全局样式污染、CSS特异性战争等常见问题,提升调试效率。特别适合处理复杂项目中的样式调试挑战。

weixin_30861797的博客 281

二分法

二分法 二分法一种很常用的方法,之前的博文也介绍过二分法,今天来谈一谈二分的一种巧用。上题—传送门: https://www.nowcoder.com/practice/dcc301bc11a7420b88afdbd272299809?tpId=90&amp;tqId=30813&amp;tPage=2&amp;rp=2&amp;ru=/ta/2018test&amp;qru=/ta/2018te...

weixin_39393640的博客 466

【C语言 初学者】 数组

数组的基本思想

2401_86738532的博客 1037
上一篇: NOJ 1145 Admission Fee
下一篇: C#操作Word和Excel笔记
ColorWaterer
博客等级 码龄12年 16粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值