思路:标准二分题,二分每一次选择的边长X。
check(x):对于一块矩形巧克力能分出的边长x正方形数量为(矩形长/x)*(矩形宽/x),如果所有的巧克力能分出>=朋友人数,则此方案可行l=x,否则不可行r=x-1。
Code:
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<set>
#include<string>
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
int n, s;
int lst[Max][2];
int check(int x)
{
int sum = 0;
for (int i = 1;i <= n;i++)
{
sum += (lst[i][0] / x) * (lst[i][1] / x);
}
if (sum >= s)return 1;
else return 0;
}
int main()
{
cin >> n >> s;
for (int i = 1;i <= n;i++)cin >> lst[i][0] >> lst[i][1];
int l = 1, r = 1e9 + 5;
while (l<r)
{
int mid = (l + r+1) / 2;
if (check(mid))l = mid;
else r = mid - 1;
}
cout << l;
}