P8647 [蓝桥杯 2017 省 AB] 分巧克力
题目描述
思路
求最大边长,一开始我看这个题的第一眼,求最值?贪心?dfs?dp?但这些感觉都没有适用的
看了题解,才发现可以二分!二分的使用条件就是求某一范围的某个数,这个范围内的数要有单调性!这个题正好
代码
因为巧克力的大小是固定的,边长越大,则能分割出来的巧克力块越小,要求最大可能边长
求最大边长,即求小于等于,即求右边界,即mid = l + r + 1 >> 1;
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int h[N],w[N];
int n, k;
bool check(int x)
{
int ans = 0;
for(int i = 1; i <= n; i++)
{
ans +=h[i] / x *( w[i]/x); //取个最小值,表示当前这块巧克力所能分的小朋友
}
if(ans >= k) //说明可以分
return true;
return false; //不可以分
}
int main()
{
//分巧克力找的是小于等于的,因为左边的都满足,所以套右边界的板子
cin >> n>>k;
//最大的边长就是巧克力的最小边长
int r = 0x3f3f3f3f;
for(int i = 1; i <= n; i++)
{
cin >> h[i]>>w[i];
r = min(min(h[i],w[i]) ,r);
}
puts("ok");
int l = 1;
//这个数组是单调递增的,边长数
//最大边长
while(l < r)
{
int mid = l + r + 1 >>1;
if(check(mid))
{
//当前的满足
l = mid; //因为条件是有等于的
}
else
r = mid - 1;
}
cout<<l <<endl;
return 0;
}
总结
这个题启发我:
二分也可以用来求最值!但要满足单调性!