文章目录

  • 用途
  • 基础代码
  • 模板
  • 题目

用途

  • 实数二分

基础代码




模板

只需要while(l <= r){ l = mid + 1; r = mid - 1; 用一个ans记录可以的时候(can函数成立)的值即可 }

 int ans = 0;while (l <= r){mid = (l + r) / 2;if (judge(mid)){r = mid - 1;ans = mid;}elsel = mid + 1;}

题目

poj1064

n条线缆, 长度为L[i],从n条电缆中要切割出K条长度相同的电缆,最长可以是多长?

#include <cstdio>
#include <cmath>
using namespace std;
const int M=10005;
const double inf=200005.0;
double L[M];
int n,k;
bool judge(double x)
{int num=0;for(int i=0;i<n;i++)num+=(int)(L[i]/x);return num>=k;
}
void solve()
{double left=0,right=inf;for(int i=0;i<100;i++) //代替while(r>l) 避免了精度问题{ //1次循环可以把区间缩小一半,100次可以达到10^(-30)的精度double mid=(left+right)/2;if(judge(mid)) left=mid;else right=mid;}printf("%.2f\n",floor(right*100)/100);
}
int main()
{while(scanf("%d%d",&n,&k)!=-1){for(int i=0;i<n;i++)scanf("%lf",&L[i]);solve();}return 0;
}

poj2456

有m只牛,n间牛舍, 第i号牛舍在xi位置,要把每只牛放在离其他牛尽可能远的地方,即最大化两头牛的距离(最小值最大化问题)

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn= 999999;
int n;
int m;
int a[maxn];
bool can(int x)
{int cnt=1;int p=0;for(int i=1;i<n;i++){if(a[i]-a[p]>=x){cnt++;p=i;}}return cnt >= m;
}
int find()
{int l=0,r=a[n-1];int ans=0;while(l<=r){//cout<<l<<" "<<r<<endl; int mid=(l+r)/2;if(can(mid)){l=mid+1;ans=mid;}else r=mid-1; }return ans;
}
int main()
{//  cin>>n>>m;
//  for(int i=0;i<n;i++)
//      cin>>a[i];scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);
//  cout<<find()<<endl;printf("%d",find());return 0;
}

poj1505

n本书,每本pi;m个人
每人分到连续若干本,且每本书只分给一个人。如果有多个解决方案,请输出第一个人工作量最小的解决方案
求使得每人分到的页数和的最大值 最小

  • 正确的代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1000
int *a;//保存页数
int n, m;// n 书的本数   m 人数
bool judge(int mid) // 假设 每人翻译mid页,判断是否可以完成
{int pagesum = 0;//记录当前一个人要翻译的页数int group = 1;//人数for (int i = n - 1; i >= 0; i--){if (pagesum + a[i] > mid)//如果当前这个人页数再多一本书会超过mid{pagesum = a[i];//把这本新的书给下一个人group++;//人数++}elsepagesum += a[i];            }if (group > m)//超过已有的人,这个假设 不能完成return false;elsereturn true;
}
void output(int l)
{int group = 1;int pagesum = 0;bool *divider = new bool[n + 1];for (int i = 0; i <= n; i++)divider[i] = true;for (int i = n - 1; i >= 0; i--){if (m - group == i + 1)break;if (pagesum + a[i] > l){pagesum = a[i];group++;}else{divider[i] = false;pagesum += a[i];}}for (int i = 0; i < n /*- 1*/; i++){cout << a[i] << " ";if (divider[i])cout << "/ ";} cout<<endl;
}
int main()
{int t; cin >> t;while (t--){cin >> n >> m;// n 书的本数   m 人数a = new int[n + 1];int l = 0, r = 0, mid = 0;for (int i = 0; i < n; i++){cin >> a[i];r += a[i];if (l < a[i])l = a[i];}int ans = 0;while (l <= r){mid = (l + r) / 2;if (judge(mid)){r = mid - 1;ans = mid;}elsel = mid + 1;}//cout << "l=" << l << " ans=" << ans << endl;//output(l);//对output(ans);//对}::system("pause");return 0;
}
  • 不知道为什么无法运行:
#include<iostream>
#include <algorithm>
using namespace std;
const int maxn=999999;
int n,m;//n book m people
int a[maxn];
int T;
bool can(int x)
{int sum = 0;int people = 1;for(int i = n-1; i>=0; i++){if(sum+a[i] > x){sum=a[i];people++;}elsesum+=a[i];}if(people>m)return false;elsereturn true;
}
int find()
{int ans=0;int l=0,r=0;int mid = 0;for(int i=0; i<n; i++)r+=a[i];while(l<=r){mid=(l+r)/2;if(can(mid)){ans = mid; r=mid-1;}          elsel=mid+1;}return ans;
}
void output(int x)
{int people = 1;int sum = 0;bool divider[maxn];for(int i  = 0; i <= n; i++)divider[i] = true;for (int i = n - 1; i >= 0; --i){if(m - people == i + 1)//剩下的的人数和剩下的书的本数相等break;if(sum + a[i] > x){sum = a[i];people++;}else//还是同一个人的书{divider[i] = false;//不拆开sum += a[i];}}for(int i = 0; i <= n; i++){cout << a[i] << " ";if(divider[i])cout << "/ ";}cout<<endl;
}
int main()
{cin>>T;while(T--){cin>>n>>m;for(int i=0;i<n;i++) cin>>a[i];sort(a,a+n);output(find());}return 0;
}

二分算法模板及oj练习题题解相关推荐

  1. 蓝桥杯万字攻略:算法模板大放送!-c++

    文章目录 前言 主要内容 由数据范围反推算法复杂度以及算法内容 基础算法 快速排序算法模板 归并排序算法模板 整数二分算法模板 浮点数二分算法模板 高精度加法 高精度减法 高精度乘低精度 高精度除以低 ...

  2. HDU 2389 Rain on your Parade(二分匹配+Hopcroft-Carp算法模板题)

    You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...

  3. 【算法模板】DFS秒杀模板—附练习题(阳光号启航)

    [算法模板]DFS秒杀模板-附练习题

  4. 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)

    一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...

  5. 【C/C++】二分查找算法模板总结(适用于大多数情况)

    二分查找算法模板 [二分条件] 条件: 单调.有序 时间复杂度: O(logn) [伪代码模板] l = -1, r = n //注意l和r一开始要在区间外 也就是二分区间为[0, n-1] whil ...

  6. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

  7. 漫画:二分解题模板(第一讲)- 修订版

    今天还是小浩算法"365刷题计划"第66天.昨天也是第66天,为什么?因为昨天我的内容忘记标识原创,马上就被人抄袭到了自己的博客,我很不爽!当然,经过投诉,对方已经删文.所以为了防 ...

  8. Python 算法模板库,Pythonista 找工作利器

    来源:Github-dashidhy https://github.com/dashidhy/algorithm-pattern-python [导语]程序员找工作,刷算法题是必不可少的一步,这里给广 ...

  9. 算法模板-广度优先遍历

    本文转载自Maple博客的算法模板-01背包问题,转载请注明出处. 简介 广度优先遍历(Breadth-First-Search,BFS),其特点便体现在广度,它是按"层"&quo ...

最新文章

  1. NATAPP本地地址映射到外网
  2. 16x16x16 4096个RGB LED的光立方是一种怎样的神奇效果?视频展示制作全过程
  3. 老姚浅谈:怎么学JavaScript?
  4. 前端学习(3099):vue+element今日头条管理-使用富文本比编辑器
  5. 个人博客四|注册登录退出功能后台开发
  6. python抓取贴吧_python抓取百度贴吧-校花吧,网页图片
  7. yaml 数组_使用 YAML 保存游戏数据 !
  8. __FILE__, __LINE__, __FUNCTION__
  9. 服务器文件地址怎么写,服务器里的文件链接地址怎么写
  10. 安装原生Win7-SP1重要补丁
  11. 机器人仿真论文阅读1
  12. 2018最新Jrebel激活服务,Jrebel激活,Jrebel激活码,Jrebel破解
  13. OpenCV笔记_20(1)基于dlib进行人脸识别( 图片检测 )
  14. chronodex怎么用_滴答清单使用全攻略:如何把手帐搬到滴答清单上,提升效率?...
  15. Mybatis 事务管理器 TransactionManager
  16. android手机截屏代码,Android手机截屏代码
  17. 软考中级 真题 2016年上半年 信息系统管理工程师 基础知识
  18. Python数据可视化第 7 讲:matplotlib绘制直方图函数hist
  19. python中global和def_Python中 Global和Nonlocal的用法详解
  20. 在ROIC的框架下精读巴菲特的新作

热门文章

  1. 01-SpringMVC 原理
  2. Ubuntu14.04 + KinectV2驱动安装 以及 Ros接口(基于网上方法试错 改进版)
  3. sklearn—特征工程
  4. wifi两种工作模式
  5. 2151: 种树 - BZOJ
  6. Android ContentProvider 内容提供者
  7. oracle01144,ORA-01144
  8. Java从键盘获取输入各种类型的数据方式
  9. CCF202012-2 期末预测之最优阈值
  10. 两个局域网如何互联_如何申请使用三大航司的机上wifi服务?