1227. 分巧克力

在这里插入图片描述
在这里插入图片描述
思路: 小巧克力边长 a 一定在 1 – 100000 之间 答案即为:在 1 – 100000 之间找到一个最大的数,使得所有的 (w[i]/a) * (h[i]/a) 之和大于要求的数量 k。
使用二分法找到 a 的最大取值即为答案。

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;

const int N = 100010;
int n,k;
int h[N],w[N];

bool check(int mid)//判断条件
{
    
    
    int res = 0;//记录分成长度为mid的巧克力数量
    for(int i = 0;i < n;i++)
    {
    
    
        res += (h[i] / mid) * (w[i] / mid);//每块巧克力分出的数量
        if(res >= k)//大于要求数量
        {
    
    
            return true;
        }
    }
    return false;
}

int main()
{
    
    
    scanf("%d %d",&n,&k);
    for(int i = 0;i < n;i++)
    {
    
    
        scanf("%d %d",&h[i],&w[i]);
    }
    int l = 1,r = 1e5;
    while(l < r)//二分查找
    {
    
    
        int mid = (l + r + 1) / 2;
        if(check(mid))
        {
    
    
            l = mid;
        }
        else
        {
    
    
            r = mid - 1;
        }
    }
    printf("%d\n",r);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45812180/article/details/114002365
今日推荐