【蓝桥杯】1227.分巧克力(二分)

https://www.acwing.com/problem/content/description/1229/

题目大意:
有K个小朋友吃巧克力,每个人都想要正方形的巧克力

一共有n块奇形怪状的巧克力

问问可以切出来的最大的边长是多少?

输入样例:
2 10
6 5
5 6
输出样例:
2

太久没写二分了,板子都丢了,麻
边界不能越界,所以用这个判断mid比较保险
int mid=(l+r+1)>>1;

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200200,M=2002;
int n,k;
int w[N],h[N];
bool check(int x)
{
    int num=0;
    for(int i=1;i<=n;i++)
    {
        num+=(w[i]/x)*(h[i]/x);
        if(num>=k) return true;
    }
    return false;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>w[i]>>h[i];
    }
    int l=1,r=1e5;
    while(l<r)
    {
        int mid=(l+r+1)>>1;
        //int mid=l+(r-l+1)/2;
        if(check(mid)) l=mid;//这里也可以的话就以它为下限
        else r=mid-1;//如果不行的话,默认上限就在它的下一个
        //cout<<l<<" "<<r<<endl;
    }
    cout<<r<<endl;
    return 0;
}
posted @ 2022-09-16 21:26  Vijurria  阅读(17)  评论(0编辑  收藏  举报