C++ 分而治之——木棒切割问题(二分法)

问题描述
给出n根木棒,长度均已知,现在希望通过切割他们来得到至少K段长度相等的木棒(长度必须是整数),问这些相等的木棒最长有多长。例如对三根长度为15、10、24的木棒来说,假设K = 7,即需要至少7段长度相等的木棒,那么可以达到的最大长度为6。
注意事项
木棒的长度均为整数,在这种情况下,第一根木棒可以提供15 / 6 = 2根木棒,第二根可以提供10 / 6 = 1根,第三根可以提供4根。2 + 1 + 4 = 7满足K根要求。
输入格式
第一行输入木棒数N,和切分后的根数K
第二行输入N根木棒的长度,以空格隔开

3 7
15 10 24

输出格式

6
#include
#include 
using namespace std;
//计算所能分割为的长度为len的木棒的根数count 
int f(int a[], int n, int len) {
	int count = 0;
	for(int i = 0; i < n; i++)
		count = count + a[i] / len;
	return count;
}
int maxSize(int a[], int n, int K) {
	int left = 1;//木棒最短为1 
	int right = a[n-1];
	int mid;
	while(left < right) {
		mid = (left + right) / 2;
		if(f(a, n, mid) < K)//木棒太长
			right = mid;	//向左侧逼近
		else
			left = mid + 1; 
	}
	return left - 1;
}
int main() {
	int n, K;//现有n根木棒 
	cin>>n>>K;//求能分割为K根等长木棒的最大长度 
	int a[10];
	for(int i = 0; i < n; i++)//输入n根木棒长度 
		cin>>a[i];
	sort(a, a+n);//升序排序
	cout<<maxSize(a, n, K);
	
	return 0;
} 

你可能感兴趣的:(笔记)