zoukankan      html  css  js  c++  java
  • 枚举--分巧克力--蓝桥杯--二分法

    问题描述
      儿童节那天有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
    单纯的进行枚举会超时,采用二分法
    每次都比较中间的数字
    如果中间的数字可以满足的话就在大一点
    如果不满足的话就小一点
    最后的出来一个结果
    #include <iostream>
    using namespace std;
    long long h[100001];
    long long w[100001];
    long long k;
    long long N;
    int fen(long long  m)
    {
      long long count=0;
      for(long long i=0;i<N;i++)
      {
          count+=(h[i]/m)*(w[i]/m); 
      }
      if(count>=k)
      return 1;
      else 
      return 0;
        
    }
    int main()
    {
        long  long q=1;
        long long z=100001;
        long long a=1;
    cin>>N;
    cin>>k;
    for(long long i=0;i<N;i++)
    {
    cin>>h[i];
    cin>>w[i];
    }
    
    while(q<=z)
    {
     long long m=(q+z)/2;
        if(fen(m)) //还可以再分 
         {
           q=m+1;
           a=m;
         }
    else
    {           
         z=m-1;
    }    
        
    }
    cout<<a;
    
    return 0;
    }
  • 相关阅读:
    内存管理 初始化(二)bootmem位图分配器建立 及 使用
    生成asm-offset
    内存管理(一)
    mongodb多表查询(附带pymongo实例)
    python3将docx转换成pdf,html文件,pdf转doc文件
    pymongo 目标计算机积极拒绝
    python中常用的推导(字典推导和列表推导)
    python2和python3的编码问题
    scrapy处理需要跟进的url
    flask上传文件时request.files为空的解决办法
  • 原文地址:https://www.cnblogs.com/jweie/p/8361704.html
Copyright © 2011-2022 走看看