pat二分学习

整数的二分:
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");
	
}

剩下多边形半径问题之后补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值