分巧克力
题意
小明有 N 块巧克力,每块巧克力是一个长方形,长为 H_i,宽为 W_i。小明需要从这些巧克力中切割出 K 块相同大小的正方形巧克力,使得每个小朋友都能得到一块相同大小的巧克力。你需要帮助小明计算出最大的正方形边长是多少,使得可以从这些长方形巧克力中切割出 K 块相同大小的正方形巧克力
思路
- 二分搜索
- 计算切割数量
- 更新答案
坑点
- 边界条件处理
- 整数除法
算法一:二分搜索
时间复杂度
O(logN)
实现步骤
- 初始化二分搜索范围
- 进行二分搜索
- 更新答案并输出
代码
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int h[n],w[n];
for(int i=0;i<n;i++){
cin>>h[i]>>w[i];
}
int l=1,r=100005;
int ans=0;
while(l<=r){
int mid=(l+r+1)/2;
int cnt=0;
for(int i=0;i<n;i++){
cnt+=(h[i]/mid)*(w[i]/mid); //这一步是在算当分的巧克力边长为mid的时候,拥有的这一块巧克力可以分多少块
}
if(cnt>=m){
l=mid+1;
ans=mid;//当在这个范围内可以切需要的巧克力量时,此时mid就可以当做切得边长;
}
else{
r=mid-1;
}
}
cout<<ans;
return 0;
}
总结
这道题要求在一个矩形巧克力上切割出最大的正方形,确保每个小朋友至少得到一块巧克力。通过二分搜索找到满足条件的最大正方形边长,并输出答案。