zoukankan      html  css  js  c++  java
  • [蓝桥杯2017初赛]分巧克力 二分

     

    题目描述

    儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
    小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
    为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
    1. 形状是正方形,边长是整数  
    2. 大小相同  
    例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
    当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?

    输入

    第一行包含两个整数N和K。(1 <= N, K <= 100000)  
    以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000) 
    输入保证每位小朋友至少能获得一块1x1的巧克力。   

    输出

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

    样例输入

    2 10
    6 5
    5 6

    样例输出

    2
     

    题解:注意是每个人至少一块巧克力,二分范围是[1,100000];

        #include<iostream>
        #include<queue>
        #include<algorithm>
        #include<set>
        #include<string.h>
        using namespace std;
    
        int h[100005],w[100005];
        int n,k;
    
        int gcd(int x,int y)
        {
            return y==0?x:gcd(y,x%y);
        }
    
        int check(int x)
        {
            int ans=0;
            for(int i=0;i<n;i++)
            {
                int x1=h[i]/x;
                int y1=w[i]/x;
                ans=ans+x1*y1;
            }
            //cout<<x<<' '<<ans<<endl;
            return ans;
        }
        int main()
        {
            
            cin>>n>>k;
            int mx;
            for(int i=0;i<n;i++)
            {
                cin>>h[i]>>w[i];
                mx=max(h[i],w[i]);
            }
            int le=1,ri=100000;
            while(le<=ri)
            {
                int mid=le+(ri-le)/2;
                int temp=check(mid);
    
                if(temp<k)//边长太大
                    ri=mid-1;
                else if(temp>=k)
                    le=mid+1;
            }
            cout<<min(le,ri)<<endl;
            return 0;
        }


  • 相关阅读:
    构建之法阅读笔记06
    构建之法阅读笔记05
    人月神话阅读笔记02
    人月神话阅读笔记01
    构建之法阅读笔记04
    学习进度09
    描绘用户场景并将典型用户和用户场景描述
    学习进度08
    第一冲刺阶段工作总结11
    第一冲刺阶段工作总结10
  • 原文地址:https://www.cnblogs.com/-citywall123/p/12331036.html
Copyright © 2011-2022 走看看