木棒切割问题(二分)---算法笔记4.5.2二分法拓展

木棒切割问题(二分)---算法笔记4.5.2二分法拓展_第1张图片

#include 
#include 
#include  
using namespace std;
const int maxn = 10010;
int main() {
	int a[maxn];
	int n,k;
	cin >> n;  
	cin >> k;
	for(int i=0; i<n; i++) {
		cin >> a[i]; 
	}
	sort(a, a+n);
	int left = 0, right = a[n-1], mid;
	while(left+1 < right) {
		int count = 0;
		mid = (left + right) / 2;
		for(int i=0; i<n; i++) {
			count += a[i] / mid;
		}
		if(count < k) { //求解第一个满足count
			right = mid;
		}
		else {
			left = mid;
		}
	}
	cout << right-1;
	return 0;
}

套用的二分搜索的模板

int solve(int A[], int left, int right, int x) {
	int mid;
	while(left + 1 < right) {
		mid = (left + right) /2;
		if(条件成立) {  //条件成立,第一个满足条件的元素的位置<=mid
			right = mid;  //往左子区间 [ left , mid ] 查找
		} else {  //条件不成立,则第一个满足该条件的元素的位置>mid
			left = mid;  //往右子区间 [ mid , right ] 查找
		}
	}
	return right; //返回夹出来的位置
}

你可能感兴趣的:(PAT,练习答案)