AcWing寒假入门班:分巧克力——2021-02-09更

AcWing寒假入门班:分巧克力

原题传送:AcWing 1227. 分巧克力

题目:

儿童节那天有 K 位小朋友到小明家做客。

小明拿出了珍藏的巧克力招待小朋友们。

小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。

为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。

切出的巧克力需要满足:

形状是正方形,边长是整数,大小相同。

例如:一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。

当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?

输入
第一行包含两个整数 N 和 K。

以下 N 行每行包含两个整数 Hi 和 Wi。

输入保证每位小朋友至少能获得一块 1×1 的巧克力。

输出

切出的正方形巧克力最大可能的边长。

数据范围

1≤N,K≤105

1≤Hi,Wi≤105

输入样例
2 10
6 5
5 6

输出样例
2

思路:

这道题目是一道二分答案题,就去二分分的边长,最后输出最大的就行了,但我一开始没想到二分,直接暴力枚举导致TLE,后来看数据才想到二分。

代码:

#include <iostream>
using namespace std;
int a[100010], b[100010],n, t;

bool chk(int m) 
{
    
    
    long long h=0;
    for(int i=1;i<=n;i++)
        h+=(a[i]/m)*(b[i]/m);
    return h>=t;
}
int main() 
{
    
    
    cin>>n>>t;
    for(int i=1;i<=n;i++)
        cin>>a[i]>>b[i];
    int z=1,y=1e5;
    while(z < y)
    {
    
    
        int m=z+y+1>>1; 
        if(chk(m))
            z=m;
        else
            y=m - 1;
    }
    cout<<z;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/SSL_wyd/article/details/113772891