思路:
1、用枚举的方法枚举出所有可能的边长中最大的边长
2、用二分法优化
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
struct node{
int h;
int w;
};
int n,k;
node x[10000000];
int main()
{
//输入
cin>>n>>k;
int i,j;
int s = 0;//面积
for(i=0;i<n;i++){
cin>>x[i].h>>x[i].w;
s = s+x[i].h*x[i].w;
}
int mj = s/k;
int r = 1000000;//为什么令r = sqrt(mj)不行?
int l = 1;
int ans = 0;
while(l<=r){
int mid = (l+r)/2;
//求出该边长的数目
int cnt = 0;
for(i=0;i<n;i++){
cnt += (x[i].h/mid)*(x[i].w/mid);
}
if(cnt>=k){
ans = mid;
l = mid+1;
}else{
r = mid-1;
}
}
cout<<ans<<endl;
return 0;
}
这篇博客探讨了一种使用枚举和二分法来优化寻找将总面积按照特定数量划分的最大边长的方法。程序首先读取n个矩形的高和宽,然后计算总面积并确定每个矩形单位面积的最大可能值。通过二分查找,找到能够满足至少k个矩形的边长大于等于该值的解。最后输出这个最大边长。此算法旨在提高效率,减少计算时间。

被折叠的 条评论
为什么被折叠?



