返回题解分享
讨论 / 题解分享/ 帖子详情

分巧克力

// 请把代码粘贴在这里

#include<bits/stdc++.h>
using namespace std;
int n,k;
int maxn;
int H[100010];
int W[100010];
int l,r,mid;
int sum,ans;
/猜想:二分难道是从11到以小明所拥有的最大巧克力的较小边为边长的正方形
以1为左端点,以上述正方形的边长为右端点?取mid值,判断是否能切出等大的K块正方形巧克力,
如果可以,则将左指针向右移一位,再取mid,如果不可以,右指针向左移动一位,取mid,
要设置变量ans存储mid值,直到左指针>右指针,最后一次二分ans保留的值,即为最大边长
/
/
问题:可最大边一定不行,除非是正方形,并且这n块巧克力必须全这么大,不剪枝吗,等等,难道是担心这两条边之间的边长可能符合要求?
回答:在二分查找里,右边界表示的是:搜索范围的上限,而不是答案可能的最大值
/

bool check(int x) {
//注意:sum要清0
sum=0;
for(int i=0;i<n;i++) {
sum+=(H[i]/x)*(W[i]/x);
}
if(sum>=k) {
return true;
}else{
return false;
}
}

int main() {

cin>>n>>k;
for(int i=0;i<n;i++) {
cin>>H[i]>>W[i];
maxn=max(H[i],maxn);
maxn=max(W[i],maxn);
//不断更新最大边,存入maxn
}
l=1;
r=maxn;
while(l<=r) {
mid=(l+r)/2;
if(check(mid)) {
ans=mid;
l=mid+1;
}else {
r=mid-1;
}
}
cout<<ans<<endl;
return 0;
}
0 回复 0 转发 0 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!