问题描述
【题目描述】
【输入】
【输出】
题目解析
暴力法
定义切割的边长 l e n = 100000 len=100000 len=100000,接着检查巧克力的块数,如果巧克力的块数>小朋友的数量则输出此时的 l e n len len,退出即可。
暴力枚举+二分
暴力法在数据量级为 1 0 8 10^8 108时运算时间> 1000 m s 1000ms 1000ms,因此我们需要用二分查找的方法对上述代码进行优化。
C++代码
暴力法代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
int h[100000];
int w[100000];
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>h[i]>>w[i];
int len = 100000; //最大的边长向下枚举
//每个巧克力块都按照len来切割
for(;len>=1;len--)
{
int cnt = 0;
for(int i=0;i<n;i++)
cnt += (h[i]/len)*(w[i]/len);
if(cnt>=k)
{
cout<<len<<endl;
return 0;
}
}
}
暴力枚举二分
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
int h[100000];
int w[100000];
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>h[i]>>w[i];
int r = 100001;
int l = 1;
int ans = 0;
while(l<=r)
{
int mid = (l+r)/2;
int cnt = 0;
for(int i=0;i<n;i++)
cnt += (h[i]/mid)*(w[i]/mid);
if(cnt>=k)
{
l = mid+1;
ans = mid;
}
else r = mid-1;
}
cout<<ans<<endl;
return 0;
}