目录

  • 一 . 二分法
    • 二分搜索得要求:
    • 二分查找步骤:
    • 二分答案:
    • 玄学的二分(二分答案)
  • 二 . 三分法
    • 例题
  • 三、01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法)

一 . 二分法

二分搜索又叫做二分查找、折半查找,它是一种效率较高得查找方法。

二分搜索得要求:

线性表为有序表,并且要用向量作为表得存储结构。

二分搜索得基本思想:先确定待查找记录所在的范围,然后逐步缩小范围直至找到或找不到该记录位置。

二分查找步骤:

1、先确定中间位置:

middle = (left+right)/2;

2、将待查找得key值与data[middle].key值相比较。若相等,则查找成功并返回该位置,否则须确定新得查找区间,继续二分查找,具体方法如下:

如果data[middle].key大于key,由于data为有序线性表,可知data[middle...right].key均大于key,因此若表中存在关键字等于key得节点,则一定在位置middle左边的子表中。

反之, data[middle].key小于key, 因此若表中存在关键字等于key得节点,则一定在位置middle右边的子表中。下一次查找针对新得区域进行查找。

二分答案:

简单地讲一下二分答案,和为什么什么时候用二分答案。当一道题目直接求解答案会很困难,但是根据题意去验证答案会很简单,那么我们就利用逆向思维,直接枚举答案,利用刚刚学到的二分查找去查找答案,然后去直接按照题意验证答案,验证成功即可输出,所以二分更多的就是逆向思维
例如下面这道题目

1.

二分法是一种快速寻找元素的方法,但又不是一种单纯的快速寻找的方法,其寻找的元素是需要一个单调有序的元素,所以在题目中如果遇到了需要排序然后寻找的,我们可以首要考虑二分法,前提是对于世界没有要求,二分法可以很迅速的找到我们所找到的元素。

二分法的实现方式是:

先将一串元素分为左右两部分,然后用中间值与所需值比较,若中间值较小,那么便取中间值与右边的边界的中间值,继续与所需值比较。若中间值较大,那么便取左边的边界与中间值的中间值,再与所需值比较,然后重复此过程,最终找到我们所需要的结果,这是一种思想,也是一种应用。

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
double a,d,e;
int b,k,t;
const double f=1e-4;
double c[100000];
int min(int a,int b)
{if(a<b)return a;else return b;
}
int max(int a,int b)
{if(a>b)return a;else return b;
}
void hs(double d,double e)
{double mid;while(d+f<e){mid=(d+e)/2.0;int g=0;for(int h=1;h<=a;++h){g+=c[h]/mid;}if(g>=k)d=mid;else e=mid;}printf("%f\n",e);
}
int main()
{cin>>t;
while(t--)
{cin>>a>>k;for(b=1;b<=a;++b){cin>>c[b];d=min(d,c[b]);e=max(e,c[b]);}hs(d,e);
}return 0;
}

2.

使用二分法操作,
圆台上下底面大小看题意,并不是非要上底半径大于下底 这个需要按上次讲的二分思想来做

    普通:     ******************************************************     while (l <= r)     {         mid = (l + r) / 2;         if (check(mid))              l = mid + 1;            else              r = mid - 1;      }     浮点数:     ******************************************************     const double EPS = 1e-9;//精确数
double l = 0, r = 100 * 1.0, mid;    while (r - l >= EPS)
{        mid = (l + r) / 2;  if (judge(mid))             l = mid + EPS;         else              r = mid - EPS;
}     ****************************************************** #include<bits/stdc++.h>
using namespace std;
const double EPS=1e-9;
const double pi=acos(-1.0);//得到π的值
double r1,r2,h,v;
bool check (double x)
{double R=1.0*r1+(r2-r1)*x/h;return 1.0/3*pi*x*(r1*r1+R*R+r1*R)<v;
}
int main()
{while(cin>>r1>>r2>>h>>v){double V=1.0/3*pi*h*(r1*r1+r2*r2+r1*r2);if(v>=V){printf("%.3lf\n",h);continue;}double l=0,r=100*1.0,mid;while(r-l>EPS){mid=(l+r)/2.0;if(check(mid))l=mid+EPS;else r=mid-EPS;}printf("%.3lf\n",(l+r)/2.0);}return 0;
}

玄学的二分(二分答案)

二分本身并不玄学,因为用的人比较傻逼(我),所以就需要玄学调参

其实总体来说,分不同的题目,二分的参数就必须准确,这一点小细节极为重要。

比如浮点数的二分物品,需要:while(l+EPS<r)
整数的二分有时候可能没办法使得l>r,就需要写成while(l+1<r)

比如下面的题目:
P1873 砍树

我写这种题都要WA一次真是丢脸

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register int i=s;i<=t;++i)
#define lver(i,t,s) for(register int i=t;i>=s;--i)using namespace std;
typedef long long ll;//全用ll可能会MLE,ll比int占的内存大const ll N=1000007;
const ll INF=1e9+9;
const ll mod=2147483647;
const double EPS=1e-6;
#undef midll n,m,arr[N];
ll r;inline bool check(ll k)
{ll sum=0;over(i,1,n)sum+=arr[i]>k?(arr[i]-k):0;return sum>=m;
}int main()
{scanf("%lld%lld",&n,&m);over(i,1,n)scanf("%lld",&arr[i]),r=max(r,arr[i]);ll l=0,mid;while(l+1<r){mid=(l+r)>>1;if(check(mid))l=mid;else r=mid;}printf("%lld",l);return 0;}

二 . 三分法


来源
我是真的懒

例题

详解链接

三、01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法)

01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法)

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧

【基础算法】二分法(二分答案,二分查找),三分法,Dinkelbach算法,算法详解+例题剖析相关推荐

  1. 【算法】差分与前缀和 算法详解+例题剖析

    目录 一.前缀和 二. 差分思想 1.静态数组的区间求和问题 2.静态维护区间加等差数列的求和问题 三.二维前缀和 二维前缀和例题P2280 [HNOI2003]激光炸弹 四.例题 例题一:差分+前缀 ...

  2. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...

  3. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  4. linux 查找目录或文件 (详解)

    linux 查找目录或文件  (详解) 查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围) -name 查找关键字 -print 如果需 ...

  5. android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...

  6. Android基础入门教程——8.3.1 三个绘图工具类详解

    Android基础入门教程--8.3.1 三个绘图工具类详解 标签(空格分隔): Android基础入门教程 本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我 ...

  7. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  8. MySQL基础篇(04):存储过程和视图,用法和特性详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.存储过程 1.概念简介 存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行.存储过程 ...

  9. Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解

    Mysql hash join之classic hash join CHJ过程详解 hash join的历史 优化器里的hash join算法在SQL Server.Oracle.postgress等 ...

最新文章

  1. 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()
  2. 为何我的BLOG不能DIY?
  3. 分享一个基于 Shiro 的权限管理系统,亮点是支持 restful 风格 URL.
  4. 【基础算法】常见的ML、DL编程题
  5. 高并发IM系统架构优化实践
  6. QT学习:多国语言国际化
  7. 2008_11_05_星期三
  8. 逻辑回归、线性回归直观感受
  9. spark基础之基于yarn两种提交模式分析
  10. Jenkins 新版本及插件在Windows下的安装
  11. java.sql.Date – Java SQL日期
  12. LabVIEW编程LabVIEW开发 Kepco ABC程控电源 例程与相关资料
  13. 华硕aura完全卸载_华硕RadeonRX 5500XT显卡,散热强力升级,畅玩游戏冷静体验
  14. 使用Pr编辑字幕-快闪效果
  15. UpdatePanel触发javascript脚本技巧javascript
  16. gg修改器怎么修改服务器数值,gg修改器怎么修改数值 | 手游网游页游攻略大全...
  17. Nexus Repository和Docker Registry镜像仓库搭建及使用
  18. 基于Python的双USB摄像头实时预览保存软件
  19. 解决win10资源管理器突然占用cpu过高问题
  20. slf4j报错:SLF4J:Failed to load class org.slf4j.impl.StaticLoggerBinder.Defaulting to no-operat有效解决办法

热门文章

  1. 各种Optimizer梯度下降优化算法回顾和总结
  2. gcc和g++是什么,有什么区别?
  3. AI时代的领航者,智能电话机器人对市场的影响
  4. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验
  5. Tomcat Servlet
  6. 数组--将两个有序数组a,b合并成新的有序数组c
  7. network-manager
  8. Listview的点击效果
  9. Android 全屏显示
  10. php把数组组成xml,php 怎么将数组转xml的函数?