木棒切割问题(***二分法)

木棒切割问题(算法笔记p134)

Note:回顾4.5.1 lower_bound 和upper_bound模板,注意上下界问题

    给出N根木棒,长度均已知,现在希望通过切割它们来得到至少K段长度相等的木棒(长度必须是整数),问这些长度的木棒最长能有多长。

    例如对三根长度分别为10,24,15 的木棒来说,假设 K = 7,即需要至少7段长度相等的木棒,那么可以得到的最大长度为6,在这种情况下,第一根木棒可以提供10/6 = 1段、第二根木棒可以提供24/6 = 4段、第三根木棒可以提供15/6 = 2段,达到了7段的要求。

    思路:如果长度相等的木棒的长度L越长,那么可以得到的木棒段数k越少。二分答案,根据对当前长度L来说能得到的木棒段数k与K的大小关系来进行二分。

#include
#include
#include
using namespace std;

int main(){
	int N, K, i, num;
	
	cin >> N >> K;
	int *len = new int[N];
	for(i = 0; i < N; i++)
	    cin >> len[i];
	
	sort(len, len + N);//将len数组元素从小到大排列 
	int left = 0, right = len[N-1], mid;
	while(left + 1 < right){
		num = 0;//将当前木段长度可分段数置0 
		mid = (left + right) / 2;
		for(i = 0; i < N; i++)
		    num += len[i] / mid;
		if(num >= K)
		    left = mid;
		else
		    right = mid; 
	}
	cout << right - 1;
	return 0;

}

 

你可能感兴趣的:(算法基础)