分巧克力
题意
求出巧克力可能的最大边长
思路
- 定义且巧克力切的块数和最大边长
- 定义左右两边的值 l 和 r ,运用二分模板来进行套用(从右边开始找答案)
- 其中,我们还要算出每块巧克力的从一整块中切下来的面积,如(h[i]/mid)*(w[i]/mid),把它们存到ans中
4.如果切的块数大于等于k(小朋友人数),那我们就直接输出最大边长x即可
实现步骤
同思路
代码
#include<iostream>
using namespace std;
const int N=1e5+10;
int n,k,h[N],w[N];
int main(){
cin>>n>>k;
for(int i=0;i<n;i++) cin>>h[i]>>w[i];
int x=0,ans=0;//最大边长,最多能切几块
int l=1,r=N;
while(l<=r)
{
int mid=l+r>>1;
for(int i=0;i<n;i++)
{
ans+=(h[i]/mid)*(w[i]/mid);
if(ans>=k)
{
x=mid;
l=mid+1;
}
else r=mid-1;//模板二
}
}
cout<<x;
return 0;
}
总结
二分模板的运用