#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
// 请在此输入您的代码
//代表巧克力的总个数,以及有k个人
int n=0,k=0;
cin>>n>>k;
int h[n],w[n];
for(int i=0;i<n;i++){
cin>>h[i]>>w[i];
}
//找到最大的边,后续方便进行二分查找,找到符合要求最大的边
//r代表正方形的边
int r=0;
for(int i=0;i<n;i++){
r=max(r,max(h[i],w[i]));
}
int l=1,ans=0;
while(l<=r){
int mid=(l+r)/2;
int sum=0;
//找到中间值后,循环遍历每一个长方形,判断这个中间值是否超过了每个长方形的长和宽
for(int i=0;i<n;i++){
if(mid<=min(h[i],w[i])){
sum+=(h[i]/mid)*(w[i]/mid);
}
}
//尝试寻找更大的值
if(sum>=k){
ans=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
cout<<ans<<endl;
return 0;
}

本题:是一个二分查找的题目,要选出符合要求的巧克力的最大的边长。
第一个问题:在定义h[n]和w[n]时。先定义了这两个数组,并且没有先输入n,这就导致了执行出错。
第二个问题:在代码中运用的max与min函数,没有事先引入头文件#include<algorithm>
第三个问题:在二分查找的过程中逻辑不太会写。
当找到1与r(边长最大值)的时候,我们要取中间值mid,然后遍历每个长方形,若mid不超过给出的长方形的长与宽,则可以将这个长方形总共可以产生的正方形数目加到总sum中,以此判断完所有的长方形可以产生的小正方形。接着用产生的正方形的总数量与总人数产生对比,若大于等于总人数的话再从mid右边找值(也就是找边长比mid还大的值),若小于总人数的话说明边长大了,就从mid左边找值(也就是找边长比mid还小的值)。