蓝桥杯:分巧克力 二分搜索

题目描述

在这里插入图片描述

思路

先模拟,计算边长取区间中点时,所有的巧克力能够分割的最大个数

  • 如果能够分割的最大个数大于等于k,那么说明边长取小了,这个时候中点及其右边的区间是可取的
  • 如果能够分割的最大个数小于k,说明边长取大了,中点左边的区间是可取的

初始的区间左端点是1,右端点是最大的边即可

代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define maxlen 100009
int hi[maxlen];
int wi[maxlen];

int main()
{
	int n, k;
	cin>>n>>k;
	int l=1; int r=INT_MIN; int size;
	for(int i=0; i<n; i++)
	{
		cin>>hi[i]>>wi[i];
		r = max(r, max(hi[i], wi[i]));
	}
	while(l<r)
	{
		size = l+(r-l)/2+1;
		int cnt = 0;
		for(int i=0; i<n; i++)
			cnt += (hi[i]/size )*(wi[i]/size);
		if(cnt>=k)
			l = size;
		else 
			r = size-1;
	}
	cout<<l<<endl;
	
	return 0;
}
发布了171 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44176696/article/details/104584797