#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, k;
vector<ll> width, height;
bool check(ll length) //判断边长为length的正方形都否满足需求
{
ll sum = 0; //记录能切成的最大方块数
for(int i = 0; i < n; i++)
{
sum += (width[i] / length) * (height[i] / length);
}
if(sum >= k) return true; //如果能切成的方块数大于等于人数
else return false;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> k;
ll t1, t2;
ll sum = 0;
for(ll i = 0; i < n; i++)
{
cin >> t1 >> t2;
width.push_back(t1);
height.push_back(t2);
sum += t1 * t2; //计算巧克力的总面积
}
ll res = sqrt(sum / k); //sum除以k是每个人最多可以分配到的巧克力面积,
//开根号即表示可能的最大边长数
ll left = 1, right = res, mid;
while(left <= right) //使用二分法搜索最大边长
{
mid = (left + right) / 2;
if(check(mid)) //判断边长为mid时是否满足分配需求
left = mid + 1;
else
right = mid - 1;
}
cout << left - 1;
return 0;
}
蓝桥杯 分巧克力 二分
于 2022-03-25 20:43:05 首次发布