二分算法模板及oj练习题题解
文章目录
- 用途
- 基础代码
- 模板
- 题目
用途
- 实数二分
基础代码
模板
只需要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练习题题解相关推荐
- 蓝桥杯万字攻略:算法模板大放送!-c++
文章目录 前言 主要内容 由数据范围反推算法复杂度以及算法内容 基础算法 快速排序算法模板 归并排序算法模板 整数二分算法模板 浮点数二分算法模板 高精度加法 高精度减法 高精度乘低精度 高精度除以低 ...
- 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 ...
- 【算法模板】DFS秒杀模板—附练习题(阳光号启航)
[算法模板]DFS秒杀模板-附练习题
- 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)
一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...
- 【C/C++】二分查找算法模板总结(适用于大多数情况)
二分查找算法模板 [二分条件] 条件: 单调.有序 时间复杂度: O(logn) [伪代码模板] l = -1, r = n //注意l和r一开始要在区间外 也就是二分区间为[0, n-1] whil ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- 漫画:二分解题模板(第一讲)- 修订版
今天还是小浩算法"365刷题计划"第66天.昨天也是第66天,为什么?因为昨天我的内容忘记标识原创,马上就被人抄袭到了自己的博客,我很不爽!当然,经过投诉,对方已经删文.所以为了防 ...
- Python 算法模板库,Pythonista 找工作利器
来源:Github-dashidhy https://github.com/dashidhy/algorithm-pattern-python [导语]程序员找工作,刷算法题是必不可少的一步,这里给广 ...
- 算法模板-广度优先遍历
本文转载自Maple博客的算法模板-01背包问题,转载请注明出处. 简介 广度优先遍历(Breadth-First-Search,BFS),其特点便体现在广度,它是按"层"&quo ...
最新文章
- NATAPP本地地址映射到外网
- 16x16x16 4096个RGB LED的光立方是一种怎样的神奇效果?视频展示制作全过程
- 老姚浅谈:怎么学JavaScript?
- 前端学习(3099):vue+element今日头条管理-使用富文本比编辑器
- 个人博客四|注册登录退出功能后台开发
- python抓取贴吧_python抓取百度贴吧-校花吧,网页图片
- yaml 数组_使用 YAML 保存游戏数据 !
- __FILE__, __LINE__, __FUNCTION__
- 服务器文件地址怎么写,服务器里的文件链接地址怎么写
- 安装原生Win7-SP1重要补丁
- 机器人仿真论文阅读1
- 2018最新Jrebel激活服务,Jrebel激活,Jrebel激活码,Jrebel破解
- OpenCV笔记_20(1)基于dlib进行人脸识别( 图片检测 )
- chronodex怎么用_滴答清单使用全攻略:如何把手帐搬到滴答清单上,提升效率?...
- Mybatis 事务管理器 TransactionManager
- android手机截屏代码,Android手机截屏代码
- 软考中级 真题 2016年上半年 信息系统管理工程师 基础知识
- Python数据可视化第 7 讲:matplotlib绘制直方图函数hist
- python中global和def_Python中 Global和Nonlocal的用法详解
- 在ROIC的框架下精读巴菲特的新作