首页 > 其他分享 >整数二分

整数二分

时间:2024-11-11 22:20:56浏览次数:1  
标签:二分 Mirko 15 int mid 整数 锯片 return

洛谷p1873砍树

题目描述:

伐木工人 Mirko 需要砍 M 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko 只被允许砍伐一排树。
Mirko 的伐木机工作流程如下:Mirko 设置一个高度参数 H(米),伐木机升起一个巨大的锯片到高度 H,并锯掉所有树比 H 高的部分(当然,树木不高于 H米的部分保持不变)。Mirko 就得到树木被锯下的部分。例如,如果一排树的高度分别为 20,15,10 和 17,Mirko 把锯片升到 15 米的高度,切割后树木剩下的高度将是 15,15,10 和 15,而 Mirko 将从第 1棵树得到 5 米,从第 4 棵树得到 2 米,共得到 7米木材。
Mirko 非常关注生态保护,所以他不会砍掉过多的木材。这也是他尽可能高地设定伐木机锯片的原因。请帮助 Mirko 找到伐木机锯片的最大的整数高度 H,使得他能得到的木材至少为 M 米。换句话说,如果再升高 1 米,他将得不到 M 米木材。

输入格式

第 1 行 2 个整数 N 和 M,N 表示树木的数量,M 表示需要的木材总长度。
第 2 行 N 个整数表示每棵树的高度。

输出

1个整数,表示锯片的最高高度。

输入样例1

4 7
20 15 17 10

输出1

15

输入样例2

5 20
4 42 40 26 46

输出2

36

二分查找模版

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
	while (l < r)
	{
		int mid = l + r >> 1;
		if (check(mid)) r = mid; // check()判断mid是否满足性质
		else l = mid + 1;//左加右减
	}
	return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
	while (l < r)
	{
		int mid = l + r + 1 >> 1;//如果下方else后面是l则这里加1
		if (check(mid)) l = mid;
		else r = mid - 1;//左加右减
	}
	return l;
}

题解

#include<iostream>
using namespace std;
const int N = 1e6;
int q[N];
int n;
long long M;
bool check(int x) {
    int s = 0;
    for (int i = 1; i <= n; i++) {
        if (q[i] > x)
            s = s + q[i] - x;
        if (s >= M)
            return true;
    }
    return false;
}
int main() {
    int l = 1, r = 4e6;
    scanf("%d %ld", &n, &M);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &q[i]);
    }
    while (l < r) {
        int mid = (l + r + 1) >> 1;
        if (check(mid))
            l = mid;
        else
            r = mid - 1;
    }
    printf("%d", r);
    return 0;
}

标签:二分,Mirko,15,int,mid,整数,锯片,return
From: https://www.cnblogs.com/Xuxuan18/p/18540700

相关文章

  • 【算法】【优选算法】二分查找算法(上)
    目录一、二分查找简介1.1朴素二分模板1.2查找区间左端点模版1.3查找区间右端点模版二、leetcode704.⼆分查找2.1二分查找2.2暴力枚举三、Leetcode34.在排序数组中查找元素的第⼀个和最后⼀个位置3.1二分查找3.2暴力枚举四、35.搜索插⼊位置4.1二分查找4.2......
  • 二分法查找
    二分查找/*折半查找,二分查找*///已经排好序的数组中进行查询#include<stdio.h>intmain(){ intlow,high,mid,userInput;//highlowmid记录的是数组下标 intflag=0;//记录能否找到 inta[10]={12,14,21,35,48,57,69,78,89,99};//二分查找的前提:已经有序 low=0......
  • 二分答案模板
    本篇主要介绍二分答案的几个模板1.常用二分模板整数二分模板1将区间划分为[l,mid]和[mid+1,r]则对应的边界更新操作为r=mid,和l=mid+1;中点mid不要+1(相当于向下取整);//整数二分模板1intbsearch_1(intl,intr){while(l<r){......
  • 【论文笔记】基于不完整数据的鲁棒多模态情感分析
    背景在现实世界的多模态情感检测中,由于存在大量的不完整的数据,影响了模型在判断情感时的准确性和鲁棒性,为了解决这一问题,本文提出了一个出了一种新颖的网络结构——Language-dominatedNoise-resistantLearningNetwork(LNLN),旨在解决数据不完整性问题,在MSA中语言模态通常包......
  • LeetCode 13[罗马数字转整数]
    题目链接LeetCode13[罗马数字转整数]详情实例提示题解思路遍历罗马字符串如果元素是除了'I'、'X'、'C'以外的罗马字,即是'V'、'L'、'D'、'M'等元素,则直接加上罗马字对应的整型数字如果元素是'I'则分以下几种情况:此元素为最后一个元素,则直接加上罗马字对应的......
  • 知识点扫盲:二分答案
    本条博客以及本系列用于记录算法学习中不熟悉或少见的知识点一.关于二分答案的来源和应用由于本大一==蒟蒻==没有经过系统性的学习,在一场牛客小白月赛中首次听说二分答案这一操作,十分震惊其效率与作用,遂写此篇来记录关于二分答案有关的概念[二分法]"https://oi-wiki.or......
  • C / C++ 整数类型转换规则与示例
    在C语言编程中,不同类型之间的转换是非常常见的事情,尤其是整数类型之间的转换,比如从较短类型到较长类型的转换、从有符号类型到无符号类型的转换等。这些转换看似简单,但如果不理解它们背后的机制,可能会导致一些隐蔽的bug。本文将深入探讨整数类型转换的规则和过程,并通过实例帮助大......
  • ABC372D ABC379F 题解 单调栈二分
    ABC372DABC379F题解单调栈二分一直觉得AT上面学到的东西比CF要多一些,无意捧一踩一,但可能是我太菜的原因,毕竟ABC的题目普遍要比Div.2简单一些。好多次碰到这个单调栈里面二分的trick了,所以写一篇来总结一下。ABC372D形象地给定一系列Buildings的高度\(h\),保证每个......
  • 二分 笔记
    二分一般来讲我们可能会在以下情况用二分:求单调函数的零点,或者找个值(二分查找)求一堆东西的最小值最大(或是最大值最小)是多少(二分答案)很难直接算出答案,但是很好判定答案合不合法对于单峰函数,可用二分导函数来代替三分二分查找二分是一种可以在\(O(chlogm)\)(m为数据规模,ch为......
  • 课程讲解--深入探究二分算法
     一、二分查找算法的基本概念定义与原理二分查找,也被称为折半查找,是一种在有序数据集合中查找特定元素的高效算法。其原理基于分治思想,每次查找都将查找区间缩小一半。例如,在一个有序数组中查找一个特定的数字,我们先比较数组中间位置的元素与目标元素的大小。如果中间元素......