整数的二分:
1.查找序列中是否存在满足某条件的元素;
2.模板,查找第一个大于等于某个条件的元素
若寻找最后一个小于某个条件的元素,只需要将上述结论-1
#include <iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
//二分学习之基本二分代码的实现
int binarySearch(int *a,int left,int right,int x)//默认为严格单调递增
{
int mid;
while(left<=right)
{
mid=left+(right-left)/2;
if(a[mid]==x)return mid;
if(a[mid]>x)right=mid-1;
if(a[mid]<x)left=mid+1;
}
return -1;
}
int lower_bound(int *a,int left,int right,int x)//寻找第一个大于等于x的位置
//若寻找第一个小于x的位置,则只需要找到第一个大于等于的位置然后减1
{
int mid;
while(left<right)
{
mid=left+(right-left)/2;
if(x<=a[mid])
{
right=mid;
}
else
{
left=mid+1; //[left,right]
}
}
return left;
}
int lower_bound1(int *a,int left,int right,int x)//寻找第一个大于等于x的位置
{
int mid;
while(left+1<right)
{
mid=left+(right-left)/2;
if(x<=a[mid])
{
right=mid;
}
else
{
left=mid;//相当于把二分区间变成了(left,right]
}
}
return right;
}
using namespace std;
int main() {
int a[5]={1,3,3,3,5};
cout<<lower_bound1(a,0,5,0);//若n为5则代表全部都大,若结果为1且检查发现并不满足条件,代表全部小
system("pause");
}
浮点数问题:
1.解决fx的根的问题
2.解决装水和木棒切分问题
fx根的问题
//浮点数
//已寻找根号2的近似值,也就是什么数的平方是2,可以设置函数fx,在区间【1,2】上进行寻找
//可以设置精度为10-5;
//实际上,上面的问题是fx=0的一个子问题,完全可以和0比较,逼近跟
const double eps=0.00005;//10-5
double Fx(double x)
{
return x*x;
}
double find()
{
double mid;
double right=2;
double left=1;
while(right-left>eps){
mid=right+(left-right)/2;
if(Fx(mid)>2)
{
right=mid;
}
else
{
left=mid;
}
}
return mid;
}
切棍子
#include <iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
//木棒问题
/*
如给定三根木棒10,15,24,至少需要7段长度相等的木棒
k自己得出的木棒数量
K至少需要
求最后一个满足k>=K的条件 转换为求第一个满足k<K的L,然后减1即可
可以设置left=1 right=24 取mid为每次切割的长度;然后计算可以切割几根
若<7 则right=mid;
若>=7 left=mid;
若left+1=right 代表找不到 返回-1
二分区间是【left,right)
*/
int a[3]={10,15,24};
int cut(int mid)
{
int sum=0;
for(int i=0;i<3;i++)
sum+=a[i]/mid;
return sum;
}
int find()
{
int left=1;
int right=24;
int mid;
while(left+1<right)
{
mid=left+(right-left)/2;
if(cut(mid)<7)
{
right=mid-1;
}
else
{
left=mid;
}
}
return left;
}
using namespace std;
int main() {
cout<<find()<<endl;
system("pause");
}
剩下多边形半径问题之后补充