二分法(浮点数)模板

博客提及了POJ - 1064,POJ是一个在线评测系统,1064可能是其中一道题目编号,但内容信息较少。

POJ - 1064

#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int n,m;
vector<double> vec;
bool judge(double l);

int main(){
	cin>>n>>m;

	for(int i=1;i<=n;i++){
		double t;
		cin>>t;
		vec.push_back(t);
	}
	
	double l,r,mid;
	l=0;r=0x003f3f3f;
	
	for(int i=1;i<=100;i++){//浮点数 进行一定次数循环满足精度要求 100次循环精度大约为10e-30
		mid=(l+r)/2;
		
		if(judge(mid))l=mid;
		else r=mid;
	}

	printf("%.2f\n",floor(l*100)/100);//printf自动进行四舍五入 要用floor截断 
	return 0;
}

bool judge(double l){
	int sum=0;
	
	for(int i=0;i<n;i++){
		sum+=vec[i]/l;
		if(sum>=m)return true;
	}
	
	return false;	
}

 

### C++ 中实现二分法的示例代码 #### 查找特定数值 对于在一个有序数组中查找特定数值的情况,可以采用以下方法: ```cpp int binarySearch(vector<int>& arr, int target) { int left = 0; int right = arr.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; // 找到目标返回索引位置 } else if (arr[mid] < target) { left = mid + 1; // 调整左边界继续向右半边搜索 } else { right = mid - 1; // 调整右边界继续向左半边搜索 } } return -1; // 如果未找到则返回-1表示不存在该元素 } ``` 此函数接收一个已经排序好的`vector<int>`类型的数组作为参数,并尝试从中找出指定的目标值的位置[^2]。 #### 处理浮点数范围内的二分查找 当处理的是连续区间而非离散集合时,则可利用更简单的逻辑来逼近解: ```cpp const double eps = 1e-7; // 定义允许误差界限 double binarySearch(double left, double right) { while (right - left > eps) { double mid = (left + right) / 2.0; if (check(mid)) right = mid; else left = mid; } return (left + right) / 2.0; } // check 函数用于判断当前mid是否满足条件 bool check(double value); ``` 这里的关键在于定义好适合具体应用场景下的`check()`函数,它决定了如何调整上下限以逐渐缩小可能解所在的区域[^3]。 #### 边界情况处理 有时不仅需要知道某个值是否存在,还需要获取其首次出现或者最后一次出现的具体位置。这时可以通过稍微修改上述模板中的比较操作达成目的: ```cpp // 寻找左侧边界 int findLeftBound(const vector<int>& nums, int target){ int l=0,r=nums.size(); while(l<r){ int m=l+(r-l)/2; if(nums[m]<target) l=m+1; else r=m; } return l<nums.size()&&nums[l]==target ? l : -1 ; } // 寻找右侧边界 int findRightBound(const vector<int>& nums,int target){ int l=0,r=nums.size(); while(l<r){ int m=l+(r-l)/2; if(nums[m]<=target) l=m+1; else r=m; } return l>0 && nums[l-1]==target?l-1:-1; } ``` 这些变体展示了二分查找不仅可以用来精确匹配单个元素,还可以灵活应用于各种不同的需求场景下[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值