/*儿童节那天有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
*/

最大分割情况就是不做分割,只需找出原始巧克力中最大的一块采用二分算法:

首先介绍二分查找算法,二分算法是一种简单,高效的搜索算法,它的原理是举例说明:

下标 0 1 2 3 4 5 6 7
数字 1 3 4 6 10 20 21 22

这是一个顺序排序的数组int a[6],现在需要返回值为4的下标:

我们首先整体搜索,选择最左边和最右边下标为L和R;

L=0;R=7;mid=(L+R)/2;

mid=3(int 只返回整数,向下取整 例如int 3.14=3 int 3.66=3)

判断a[mid]是否为4 a[3]=6>4说明这个值在a[3]的左边,搜索范围变成[L,mid-1] R=mid-1;

mid=(L+R)/2,mid=1 a[1]=3<4;说明在a[1]右边,搜算范围变成L=mid+1范围在[mid+1,R]

L=2 R=2 mid=(L+R)/2=2 mid[2]=4 ;返回其下标,二分法就是不断缩小搜索范围进行快速搜索;分块巧克力也可使用。

分块巧克力

题目所给最小边长为1,使用二分法,确定下边界为1,最大值为r,mid=(1+r)/2.区间划分成[1,mid-1][mid,r] 将mid*mid的巧克力分给各个小朋友,每块巧克力可以分成(Hi/mid,Wi/mid);

算出每块巧克力可分出来的块数之和sum小于小朋友的个数,那么则不够分,r=mid-1,mid=(1+r)/2,用来减小mid的大小以提高sum的总数,若大于小朋友的总数,则成立,但是每个小朋友渴望分到最大的一块,所以将mid=1,mid=(1+r)/2以增加mid的个数。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100010;
int n,m;//n为输入的样例个数 m为小朋友的个数
int h[N],w[N];//存储第i块巧克力的Hi和Wi
int max(int a,int b)
{return a>b?a:b;}
bool check(int mid)//检查切出来的巧克力数是否大于等于人数
{LL res=0;for(int i=0;i<n;i++){res+=(LL)h[i]/mid*(w[i]/mid);if(res>=m) return true;}return false;
}
int main()
{int l=1,r=0;cin>>n>>m;for(int i=0;i<n;i++){cin>>h[i]>>w[i];r=max(r,max(h[i],w[i]));//对比得出r的值,确定范围 }while(l<r){   int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}cout<<r;return 0;} 

运行结果:

蓝桥杯 2017试题I 分巧克力(二分求解)相关推荐

  1. 2017蓝桥杯省赛---java---B---9(分巧克力)

    题目描述 标题: 分巧克力儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们.小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形.为了公平起见,小明需要从这 N 块 ...

  2. 2017蓝桥杯c语言C组承压计算,蓝桥杯2017Java B组---分巧克力and承压计算

    分巧克力 package lala; /* *儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起 ...

  3. 蓝桥杯真题:分巧克力

    我们要求出满足条件的大的边长m. 首先我们知道最长的边长是100000,最小的边长是1,那么我们可以来二分,最初设l=1,r=100000 之后进行如下操作: 1.求中点位置mid=(l+r)/2 2 ...

  4. 蓝桥杯-历届试题-猴子分苹果

    题目: 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果.第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份 ...

  5. 蓝桥杯 历届试题 分考场 (DFS)-----C语言—菜鸟级

    问题 1874: [蓝桥杯][2017年第八届真题]分考场 时间限制: 1Sec 内存限制: 128MB 提交: 62 解决: 12 题目描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人 ...

  6. 二分搜索,POJ2456,NYOJ 914, 区间移位-蓝桥杯-历届试题

    二分搜索是不断缩减可能解的范围来得到最优解, 因为每次是折半, 所以指数爆炸有多快,这个效率就有多高 POJ2456为例, 传送门 简而言之, 就是将牛之间的距离的最小值最大化. #include&l ...

  7. 蓝桥杯:试题 算法训练 Remember the A La Mode

    蓝桥杯:试题 算法训练 Remember the A La Mode 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Hugh Samston经营着一个为今年的ICPC世界总决赛的参 ...

  8. 蓝桥杯c语言试题幸运数,蓝桥杯  历届试题 幸运数  dfs

    时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,. ...

  9. [蓝桥杯][2017年第八届真题]包子凑数(解题报告)

    问题 1886: [蓝桥杯][2017年第八届真题]包子凑数 时间限制: 1Sec 内存限制: 128MB 提交: 406 解决: 118 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家 ...

最新文章

  1. Java 对象初始化的过程介绍
  2. LR 场景选项配置--笔记
  3. 解决gnome3 不能设置无线网络属性
  4. 「POJ 1135」Domino Effect(dfs)
  5. matlab 实现 stacked Autoencoder 解决图像分类问题
  6. 利用rpm包搭建lamp环境及论坛的创建
  7. ASP.NET基础教程-Web 自定义控件的使用-根据属性值从数据库中提取数据并在页面上自动生成一个表格...
  8. 在C#中使用SQLite
  9. 二分法变种小结(leetcode 34、leetcode33、leetcode 81、leetcode 153、leetcode 74)
  10. 【Pytorch神经网络基础理论篇】 07 线性回归 + 基础优化算法
  11. python激活虚拟环境source不是内部或外部_激活虚拟环境的问题
  12. 原生JDBC连接MySQL数据库踩的坑
  13. Python数据挖掘-文本挖掘
  14. HTML 参考手册- (HTML5 标准)
  15. 手机app支付宝支付和苹果支付分析
  16. 教学管理文件信息检索系统设计与实现
  17. 陈艾盐:春燕百集访谈节目第二十五集
  18. Android获取手机的卡槽数量和sim卡数量
  19. Unity触发检测和碰撞检测
  20. screw (螺丝钉) 数据库表结构文档生成工具(转发)

热门文章

  1. 调用系统的警告框(MessageBoxButtons)
  2. 计算机环境下的审计技术方法有哪些,审计技术方法的类型包括哪些
  3. Arduino UNO基于Timer2的舵机驱动库(精度比官方的高)
  4. mysql mgr搭建_MGR的搭建部署
  5. Python用SSH连接交换机以及多命令输入(paramiko)
  6. 【kubernetes学习】
  7. c语言从键盘输入一个不超过8位的正的十六进制数字符串,蓝桥基础练习 十六进制转十进制...
  8. 02- OpenCV绘制图形及图像算术变换 (OpenCV系列) (机器视觉)
  9. go 操作 Excel
  10. 【dxf】(1)dxf 转 geojson