【二分查找】分巧克力、机器人跳跃、数的范围

news2024/12/26 1:01:57

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

 

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

 

开始准备蓝桥杯啦!这是计划的一部分,每天都会更新一个专题的内容,内容参考自acwing蓝桥杯辅导课,有兴趣的uu们也可以自行观看

二分查找模板在前几篇文章中有讲过 二分查找详解

题目:数的范围

给定一个按照升序排列的长度为 n的整数数组,以及 q 个查询。

对于每个查询,返回一个元素 k的起始位置和终止位置(位置从 00 开始计数)。

如果数组中不存在该元素,则返回 -1 -1

输入格式

第一行包含整数 n 和 q,表示数组长度和询问个数。

第二行包含 n个整数(均在 1∼100001∼10000 范围内),表示完整数组。

接下来 q 行,每行包含一个整数 k,表示一个询问元素。

输出格式

共 q行,每行包含两个整数,表示所求元素的起始位置和终止位置。

如果数组中不存在该元素,则返回 -1 -1

数据范围

1≤n≤100000
1≤q≤100001
1≤k≤100001

输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例:

3 4
5 5
-1 -1

白话讲解:

非常经典的二分模板 ,通过前面的学习,我们知道二分查找有一个范围的问题,即是mid>= 还是mid>,也就是开闭区间的问题,这题完美诠释了这个特性

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int q[N];
int main()
{
    scanf("%d%d",&n/*正数组长度*/,&m/*查询个数*/);
    for(int i=0;i<n;i++){
        scanf("%d",&q[i]);
    }
    while(m--)
    {
        int x=0;
        scanf("%d",&x);
        int left=0,right=n-1;
        while(left<right)
        {
            int mid=(left+right)>>1;
            if(q[mid]>=x)right=mid;
            else left=mid+1;
        }
        if(q[left]!=x)cout<<"-1 "<<"-1 "<<endl;
        else{
            cout<<left<<" ";
            int left=0,right=n-1;
            while(left<right)
            {
                int mid=(left+right+1)>>1;
                if(q[mid]<=x)left=mid;
                else right=mid-1;
            }
            cout<<left<<endl;
        }
    }
    return 0;
}

题目:机器人跳跃问题

机器人正在玩一个古老的基于 DOS 的游戏。

游戏中有 N+1 座建筑——从 00 到 N 编号,从左到右排列。

编号为 00 的建筑高度为 00 个单位,编号为 i 的建筑高度为 H(i) 个单位。

起初,机器人在编号为 00 的建筑处。

每一步,它跳到下一个(右边)建筑。

假设机器人在第 k个建筑,且它现在的能量值是 E,下一步它将跳到第 k+1 个建筑。

如果 H(k+1)>E,那么机器人就失去 H(k+1)−E的能量值,否则它将得到 E−H(k+1)的能量值。

游戏目标是到达第 N个建筑,在这个过程中能量值不能为负数个单位。

现在的问题是机器人至少以多少能量值开始游戏,才可以保证成功完成游戏?

输入格式

第一行输入整数 N。

第二行是 N个空格分隔的整数,H(1),H(2),…,H(N) 代表建筑物的高度。

输出格式

输出一个整数,表示所需的最少单位的初始能量值上取整后的结果。

数据范围

1≤N,H(i)≤1e5

输入样例1:

5
3 4 3 2 4

输出样例1:

4

输入样例2:

3
4 4 4

输出样例2:

4

输入样例3:

3
1 6 4

输出样例3:

3

白话讲解:

也就是有一个机器人要进行平台跳跃

若平台比他现在的位置高,则需要扣除h(i)-E的能量,若他比平台高,则能获得E-h(i)的能量,要求跳跃中能量不能为负

题解:

分析两个扣除能量的规则就可以发现,不论高低与否,能量E=2E-h(i) ,也就是能量一直都是这样改变的,判断是否能用二分来搜寻答案最重要的就是判定其是否满足递增的条件(必要不充分),

当找到一个满足条件的E之后,大于E的情况下是都能跳跃过去.所以我们用二分来做.

int的数据范围最大为1e9,而观察这题题设范围,当h(i)足够小的时候,E=2E,有可能爆int,所以我们推断,当E=h(i)max时,此时表达式为E=E+h(i)max-h(i) h(i)无限小,即可忽略不计,所以当E=h(i)max时,即可表示其可跳跃过之后所有的格子.

也可以理解为,当我跳到最高点时,之后都是在增加能量,而不是减少,所以即可判定一定能跳过

另外,刚刚说过了>=E的条件都满足题解,所以这里的二分为left=mid+1 right=mid

不懂我在说什么的uu可以回顾下二分

check函数为:模拟跳跃每一次

代码实现:

#include<iostream>
#include<stdio.h>
using namespace std;
const int N=100010;
long n=0,h[N];
bool check(int e)
{
    for(int i=1;i<=n;i++)
    {
        e=2*e-h[i];
        if(e>=1e5)return true;
        if(e<0)return false;
    }
    return true;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&h[i]);
    }
    int l=0,r=1e5;
    while(l<r)
    {
       int mid=l+r>>1;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    printf("%d\n",r);

}

题目:分巧克力蛋糕

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

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

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

  1. 形状是正方形,边长是整数;

  2. 大小相同;

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

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

输入描述

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

以下 N 行每行包含两个整数Hi​,Wi​ (1≤Hi​,Wi​≤1e5)。

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

输出描述

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

输入输出样例

示例

输入

2 10
6 5
5 6

输出

2

 

白话讲解:

有k个小朋友来家里,而我有N块巧克力,如何切出k个正方形,且每个正方形面积最大,输出边长

题解:

边越大则面积越大,但能分的块数就越少,所以我们要找到的是一个边最大,且块数等于k的边长

这题与上题的区别为,正方形的边长a不满足 a满足题意 比a大的都满足题意.但比a小的都满足题意,所以这题的区间为右半边为开区间,也即left=mid,right=mid-1.

check函数为wi/e*hi/e 这里可以理解为,巧克力总面积除以每一块巧克力的面积,即为块数,为什么是除/边长呢?向下取整.之后若>=k则说明满足题意返回即可,当所有巧克力切完还不满足,则返回false

代码实现:

#include <iostream>
using namespace std;
const int N=10010;
int h[N],w[N];
int n=0,k=0;
bool check(int e)
{
    int res=0;
    for(int i=0;i<n;i++)
    {
        res+=(h[i]/e)*(w[i]/e);
        if(res>=k)return true;
    }
    return false;
}
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        cin>>h[i]>>w[i];
    }
    int l=1,r=1e5;
    while(l<r)
    {
        int mid=l+r+1>>1;
        if(check(mid))l=mid;
        else r=mid-1;
    }
    printf("%d",l);
    return 0;
}

完结撒花:

🌈本篇博客的内容【分巧克力、机器人跳跃、数的范围】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二层如何避免loop 的产生

STP是一个用于局域网中消除环路的协议。STP通过构造一棵树来消除交换网络中的环路二层交换机二层交换机不具备路由能力&#xff0c;主要功能有三种1&#xff09;地址学习&#xff08;address learning&#xff09;&#xff1a;通过查看帧的源MAC地址来加紧转发/过滤表的MAC地址…

django框架开发部署项目

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

工作负载使用教程

主要包括YCSB和背景一、安装Java二、安装Memcached数据库并配置三、修改YCSB脚本文件四、运行YCSB脚本五、运行GAPBS总结背景 测试multi-clock内核的内存性能有啥提升 YCSB&#xff1a;雅虎推出的云数据库基准测试套件 参考论文MULTI-CLOCK: Dynamic Tiering for Hybrid Memor…

03-产品解决方案:需求分析、功能优先级划分、功能价值、用户体验

文章目录3.1 需求分析3.1.1 需求分析的目的3.1.2 需求分析的方法&#xff08;Y模型&#xff09;3.1.3 需求分析的具体应用3.2 功能优先级划分Kano模型3.3 功能价值3.3.1 什么是功能价值&#xff1f;3.3.2 实际价值判断3.3.3 成本评估3.4 用户体验3.4.1 用户体验的定义及影响因素…

IDEA 每次新建工程都要重新配置 Maven 解决方案

IDEA 每次新建工程都要重新配置 Maven 解决方案 IDEA 每次新建工程都要重新配置 Maven&#xff0c;是一件相当浪费时间的事情。这是因为在创建一个项目后&#xff0c;在 File -> Settings -> Build,Execution,Deployment -> Build Tools -> Maven下配置了 Maven h…

华为OD机试用Python实现 -【停车找车位】 |2023.Q1 A卷

华为OD机试题 最近更新的博客华为 OD 机试 300 题大纲本篇题目:停车找车位题目描述输入描述输出描述示例一输入输出示例二输入输出代码编写思路Python 代码最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题

QML编码约定

QML中的国际化&#xff1a; QML使用以下函数来将字符串标记为可翻译的 qsTr()qsTranslate()qsTrld()QT_TR_NOOP()QT_TRANSLATE_NOOP()QT_TRID_NOOP最常用的还是qsTr&#xff08;&#xff09; string qsTr&#xff08;string sourceText&#xff0c; string disambiguation&…

Linux- 系统随你玩之--文件管理-双生姐妹花

文章目录1、前言2、文件管理-双生姐妹花2.1、 df2.1.1、 df 语法2.1.1 、常用参数2.2、 du2.2.1、du 语法2.1.1、 常用参数2.3、双生姐妹花区别2.3.1、 查看文件统计 的计算方式不同2.3.2 、删除文件情况下统计结果 不同2.3.3 、针对双生姐妹花区别 结语3、双生姐妹花实操3.1 、…

[2019红帽杯]childRE

题目下载&#xff1a;下载 参考&#xff1a;re学习笔记&#xff08;24&#xff09;BUUCTF-re-[2019红帽杯]childRE_Forgo7ten的博客-CSDN博客 这道题涉及到c函数的修饰规则&#xff0c;按照规则来看应该是比较容易理解的。上面博客中有总结规则&#xff0c;可以学习一下。 载…

不同的网络分层模型与其常见的协议和硬件

文章目录一、网络分层模型1.1 OSI七层参考模型1.2 TCP/IP分层模型1.3 数据的分层传输二、网络通信媒介和数据链路2.1 网卡2.2 中继器Repeater2.3 集线器交换机(二层设备) 比集线器升级了什么二层交换机和三层交换机说明&#xff1a;该博客粗略整理了下不同的网络模型&#xff0…

Vue3之组件间传值避坑指南

组件间传值的两个坑 我们都知道父组件可以把值传递到自组件中&#xff0c;但是有时候子组件需要修改这个父组件传递过来的这个值&#xff0c;我们可以想象下能修改成功吗&#xff1f;这是坑之一。我们在组件间传值的时候&#xff0c;都是一个属性名对应一个值&#xff0c;接收…

泛函分析导论

它的基本思想是将函数看作向量&#xff0c;从而将函数空间转化为向量空间&#xff0c;进而研究函数空间的性质。泛函分析的主要内容包括&#xff1a;线性空间、内积空间、赋范空间、希尔伯特空间、算子理论、谱理论、函数空间等。空间与算子度量空间赋范空间和巴拿赫空间线性算…

Mybatis插件开发及执行原理

mybatis源码下载 https://github.com/mybatis/mybatis-3&#xff0c;本文分析源码版本3.4.5 mybatis启动大致流程 在看这篇文章前&#xff0c;建议查看我另一篇文章&#xff0c;以了解框架启动的流程和框架中一些重要对象&#xff1a;https://blog.csdn.net/Aqu415/article/…

com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannel

一 完成的错误信息 异常Message one Caused by: com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information 异常Message two [com.alibaba.nacos.client.remote.worker] ERROR…

K8S 实用工具之二 - 终端 UI K9S

开篇 &#x1f4dc; 引言&#xff1a; 磨刀不误砍柴工工欲善其事必先利其器 第一篇&#xff1a;《K8S 实用工具之一 - 如何合并多个 kubeconfig&#xff1f;》 像我这种&#xff0c;kubectl 用的不是非常溜&#xff0c;经常会碰到以下情况&#xff1a; 忘记命令&#xff0c;先…

基于粒子群改进的支持向量机SVM的情感分类识别,pso-svm情感分类识别

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的情感分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型…

【C++修炼之路】25.哈希应用--布隆过滤器

每一个不曾起舞的日子都是对生命的辜负 布隆过滤器前言一.布隆过滤器提出二.布隆过滤器概念三. 布隆过滤器的操作3.1 布隆过滤器的插入3.2 布隆过滤器的查找3.3 布隆过滤器的删除四.布隆过滤器的代码4.1 HashFunc的仿函数参考4.2 BloomFilter.h五.布隆过滤器的优缺点六.布隆过滤…

Spring——Bean管理-xml方式进行属性注入

目录 一、xml方式创建对象 二、xml方式注入属性 第①种方式注入&#xff1a;set方法注入 第②种方式注入&#xff1a;有参构造函数注入 constructor-arg&#xff1a;通过构造函数注入 用name标签属性&#xff1a; 不按照顺序也会自动匹配 使用index标签属性&#xff1a;…

使用Struts的论坛系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网的高速发展&#xff0c;目前可通过论坛系统可随时取得国际最新的软件及信息&#xff0c;也可以通过论坛系统来和别人讨论计算机软件、硬件、多媒体、程序设计、以及影视等等各种有趣的话题。本系统按照小型公司的实际要求…