首先我们来看题目要求:
根据题目要求我们知道我们需要找出一个x,满足题目要求(使得K*x*x(分割好的满足条件的面积)<=巧克力总面积),此时通过逆向分析,找到x,我们需要在满足(hi>=1&&wi<=100000)的条件下,查找符合题意的x
因为查找的范围后期会大,我们可以通过二分查找法,缩短查找时间,在hi与wi中查找,以mid=(hi+wi)/2为界限,或往上或往下查找-->定义全局变量--将h,w分别通过数组存储--以mid为界进行二分--传入函数--判断是否满足分的的人数--返回值--若true,则往上查找符合条件的最大值--若false,则往下查找符合的值,以上思路我们通过代码来实现
#include<iostream>
using namespace std;
int N,K; //定义全局变量,以便在自定义函数中使用
int h[100000]={0};
int w[100000]={0};
bool judge(int x) //用judge()函数,判断输入的值是否符合(即是否不超过原面积(h[i]*w[i])),如果是则返回true
{
int sum=0;
int i;
for(i=0;i<N;i++)
{
sum+=(h[i]/x)*(w[i]/x); //h[i]/x*w[i]/x=切割好后分得的份数(同时不超过原面积)
}
if(sum>=K) //即满足题目要求分的份数K时,返回true
{
return true;
}else{
return false;
}
}
int main()
{
cin>>N>>K;
int max=0;
int i;
for(i=0;i<N;i++)
{
cin>>h[i]>>w[i];
}
int l,r; //l为长,即题目中的h[i],r为宽w[i]
l=1; //题目要求(l>=1,w<=100000
r=100000;
while(l<=r) //当l<=r时进入循环
{
int mid=(r+l)/2; //二分法缩短查找时间
if(judge(mid)) //将中间值mid传入judge()函数进行判断,若符合,即返回true,进行第一条语句 ,查找以mid为分界线的上半部分(查找最大值),否则下半部分
{
max=mid;
l=mid+1; //继续向>mid上查找,以致结束循环
}else{
r=mid-1;
}
}
cout<<max;
return 0;
}