zoukankan      html  css  js  c++  java
  • 分巧克力

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

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

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

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

    切出的巧克力需要满足:

    1. 形状是正方形,边长是整数
    2. 大小相同

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

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

    输入格式

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

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

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

    输出格式

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

    数据范围

    1N,K105,
    1Hi,Wi105

    输入样例:

    2 10
    6 5
    5 6
    

    输出样例:

    2

    二分法:在 1 – 100000 之间找到一个最大的数,使得所有的 (w[i]/mid) * (w[i]/mid) 之和大于要求的数量 k;

    #include<iostream>
    using namespace std;
    const int N = 100010;
    typedef long long ll;
    int h[N],w[N];
    int n,k;
    
    inline bool check(int mid){
        ll res = 0;   //考虑最差结果,计算大小为10e5*10e5的巧克力的值时超出int范围,所以用long long
        
        for(int i = 1;i<=n;++i){
            res+=(ll)h[i]/mid*(w[i]/mid);
            if(res>=k) return true;
        }
        return false;
    }
    int main()
    {
        cin>>n>>k;
        for(int i = 1;i<=n;++i){
            cin>>h[i]>>w[i];
        }
        
        int l = 1,r = 1e5;
        while(l<r){
            int mid = l+r+1 >>1; //防止溢出
            if(check(mid)) l = mid;
            else r = mid-1;
        }
        
        cout<<r<<endl;
        return 0;
    }
     
  • 相关阅读:
    springboot springcloud zuul 过滤器
    springboot springcloud eureka 熔断器
    javaweb servlet filter
    maven nexus 搭建私服(二)
    springboot springcloud zuul 网关入门
    springboot springcloud 配置中心
    springboot springcloud eureka 入门
    java rabbitmq
    java jvm调优
    maven nexus 搭建私服(一)
  • 原文地址:https://www.cnblogs.com/ssfannnnn/p/14396742.html
Copyright © 2011-2022 走看看