首页 > 其他分享 >分巧克力(二分法)

分巧克力(二分法)

时间:2023-03-30 17:58:02浏览次数:51  
标签:10 巧克力 int mid 二分法 查找 小朋友

题目描述

儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。

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

小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足:

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

例如一块 6x5 的巧克力可以切出 6 块 2x2 的巧克力或者 2 块 3x3 的巧克力。

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

输入描述

第一行包含两个整数 N,K (1≤N,K≤10’5)。

以下 N 行每行包含两个整数 Hi,Wi (1≤Hi,Wi≤10‘5)。

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

输出描述

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

输入输出样例

示例

输入

2 10
6 5
5 6

输出

2

思路

  • 首先,明确一个概念:并不是需要恰好切为k个,而是保证至少k个,并且最大
  • 其次,如何确定大小。分别求出每块巧克力可以分出的最大值,然后找到最大值里的最小值。
  • 如何求最大值,通过二分查找法,因为规定长和宽不超过10’5,我们从中间数开始,进行查找,每次查找都要检查是否符合条件。符合条件者寻找右边更大的数,不符合条件者寻找左边的最大数。
  • 条件有两个,一:是否可以被原巧克力切。二:是否加起来能大于等于k。

代码

#include<bits/stdc++.h>
using namespace std;
int n,k;
int h[100005],w[100005];
bool check(int mid){
	int sum = 0;
	for(int i = 0;i < n;++i){
		sum += (h[i]/mid) * (w[i]/mid);
	}
	if(sum >= k){
		return true;
	}
	else{
		return false;
	}
}
int main(){
	cin >> n >> k;
	for(int i = 0;i < n;++i){
		cin >> h[i] >> w[i];
	}	
	int l = 1;
	int r = 100000;
	int max = 0;
	while(l < r){
		int mid = l + (r - l)/2 + 1;
		if(check(mid)){
			max = mid;
			l = mid;
		}
		else{
			r = mid - 1;
		}
	}
	cout << max << endl;
	return 0;
}
  • 代码中有一个细节,mid在取值的时候要+1,原因是,我们使用二分查找法选择的是最大数。使用l < r 作为循环条件,将数缩小到两个数的范围时进行判断,如果左侧为合适的值,l不动,r也不动,就会一直陷入死循环,而循环条件是为了当两数两数相等时退出循环,两数任意一个数都可以拿出来进行操作。所以为了避免死循环,就要保证每次选择右边的数。
  • 具体理解可以查看我的博客二分查找法学习心得(如何具体问题具体分析) - ku然 - 博客园 (cnblogs.com)

标签:10,巧克力,int,mid,二分法,查找,小朋友
From: https://www.cnblogs.com/isku-ran/p/17273794.html

相关文章

  • 二分法
    关于二分法:二分法使用要求待查找的数据集必须有序二分法的缺陷针对开头结尾的数据查找效率很低常见算法的原理以及伪代码二分法、冒泡、快拍、插入、堆排、桶排、数......
  • 吃巧克力,容器vector、map,容器适配器 priority_queue,算法sort排序
     #include<algorithm>#include<queue>#include<map>#include<vector>#include<iostream>usingnamespacestd;structchocolate{longlonga;//价......
  • 算法—二分法详解
    二分法详解目录二分法详解1.二分法2.引论:猜数游戏3.整数域二分1、在单调递增序列中找x或者x的后继2、在单调递增序列中查找x或者x的前驱3.简易二分模板4.浮点数二......
  • python实现一个二分法
    #################      ############################### ......
  • 二分法:区间的重要性(初探)
    哈喽,我是404,正在努力提升代码能力的未来女程序员(笑),这是我的第一篇博客,接下来会记录我的学习之路到我力扣完全可以手撕,废话不多说,正文开搞!通过初见力扣经典题目704.二......
  • python实现一个二分法
    #################                 ############################### #########################......
  • 二分法求三次方根
      #include<iostream>usingnamespacestd;intmain(){doublen;cin>>n;intl=1,r=n;while(l+1e-7<r){doublemid=(l+r)/2;if(mid*mid*mid>=n){r=mid;}elsel......
  • python 二分法查找
    二分查找(搜索)是一种在有序列表中查找某一特定元素的搜索算法。二分搜索是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是......
  • 二分法查找
    原理一个数据有升序的数组,每次取中间元素比较,如果大于需要查找的元素,则去后面数据,中间数据作为起点最后数据作为终点再定中间数据比较。如果小于需要查找的数据,则取前面......
  • 二分法
      #include<iostream>usingnamespacestd;constintN=1e5+10;inta[N],st[N];intnum=0;intmain(){intn,q;cin>>n>>q;for(inti=1;i<=n;i++){cin>>a[i];......