算法复习之二分【备战蓝桥杯】

二分模板一共有两个,分别适用于不同情况。
算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。

版本一

当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;计算mid时不需要加1。

int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}return l;
}

版本二

当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;此时为了防止死循环,计算mid时需要加1。

int bsearch_2(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

总结

假设有一个总区间,经由我们的 check 函数判断后,可分成两部分,
这边以o作 true,…作 false 示意较好识别

如果我们的目标是下面这个v,那麽就必须使用模板 1

…vooooooooo

假设经由 check 划分后,整个区间的属性与目标v如下,则我们必须使用模板 2

oooooooov…

所以下次可以观察 check 属性再与模板1 or 2 互相搭配就不会写错啦

练习题

503. 借教室

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;
const int N = 1000010;
int n, m;
int w[N];
int d[N], l[N], r[N];
LL b[N];bool check(int mid) 
{memset(b, 0, sizeof b);for (int i = 1; i <= mid; i ++ ) {b[l[i]] += d[i];b[r[i] + 1] -= d[i];}for (int i = 1; i <= n; i ++ ) {b[i] += b[i - 1];if (b[i] > w[i]) return false;}return true;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);for (int i = 1; i <= m; i ++ ) scanf("%d%d%d", &d[i], &l[i], &r[i]);int l = 0, r = m;while(l < r){int mid = l + r + 1>> 1;if (check(mid)) l = mid;else r = mid - 1;}if (r == m) printf("0\n");else printf("-1\n%d", r + 1);return 0;
}作者:大四萌新.
链接:https://www.acwing.com/activity/content/code/content/7899026/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1227. 分巧克力

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1e5 + 10;int n, k;
int h[N], w[N];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;}return false;
}int bsearch()
{int l = 1, r = 1e5 + 10;while (l < r) {int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}
}int main()
{scanf("%d%d", &n, &k);for (int i = 0; i < n; i ++ ) scanf("%d%d", &h[i], &w[i]);printf("%d", bsearch());return 0;
}作者:大四萌新.
链接:https://www.acwing.com/activity/content/code/content/7878482/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4956. 冶炼金属

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 10010;
int n;
int a[N], b[N];bool check_1(int mid) 
{// 找最小的 那么其他部分都得满足小于等于b[i]for (int i = 0; i < n; i ++ ) if (a[i] / mid > b[i]) return false;return true;
}bool check_2(int mid) 
{// 找最大得 那么其他部分都得满足大于等于b[i]for (int i = 0; i < n; i ++ ) if (a[i] / mid < b[i]) return false;return true;
}int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++ ) scanf("%d%d", &a[i], &b[i]);int l = 1, r = 1e9 + 1;while (l < r) {int mid = l + r >> 1;if (check_1(mid)) r = mid;else l = mid + 1;}printf("%d ", l);r = 1e9 + 1;while (l < r){int mid = l + r + 1 >> 1;if (check_2(mid)) l = mid;else r = mid - 1;}printf("%d", l);return 0;
}作者:大四萌新.
链接:https://www.acwing.com/activity/content/code/content/7899986/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略

前言 随着容器技术的日益成熟&#xff0c;Docker已经成为现代软件开发和部署的标配工具。其中&#xff0c;自定义Docker镜像是满足特定项目需求的关键步骤。特别是在Java开发环境中&#xff0c;我们可能需要为不同的项目配置不同版本的JDK。这时&#xff0c;通过Docker自定义J…

临时笔记2

临时笔记2 数据库设计 有哪些表 表里有哪些字段 表和表之间是什么关系 JDBC(全称&#xff1a;JAVA DATABASE CONNECTIVITY) 本质是官方定义的一套操作所有关系型数据库的规则&#xff0c;即接口。每个数据库厂商去实现这一接口&#xff0c;写出实现类&#xff0c;即驱动&…

List<Object>集合对象属性拷贝工具类

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝&#xff0c;但如果应用到List集合的话就需要遍历去操作了&#xff0c;如下&#xff1a; 打印结果&#xff1a; …

Cocos Creator 3.8.x 后效处理(前向渲染)

关于怎么开启后效效果我这里不再赘述&#xff0c;可以前往Cocos官方文档查看具体细节&#xff1a;后效处理官网 下面讲一下怎么自己定义一个后处理效果&#xff0c;想添加自己的后效处理的话只需要在postProcess节点下添加一个BlitScreen 组件即可&#xff0c;然后自己去添加自…

第三方集成站点带token访问SpringSecurity应用站点自动登录方案

近期有个WEB项目需要改造。业主找第三方搞了一个集成站点&#xff0c;将多个应用站点的链接集中放在一个导航页面。由于进入集成站点时已经登录过了&#xff0c;业主要求点击这些应用站点的链接时就不必再登录。 以前做过类似项目&#xff0c;用的是单点登录。大家都用同一个登…

关于python数据可视化的学习(多维数组)

import numpy as np # 通过这个语句可以知道其是否存在nmpy这个包 创建数据 H np.array([[[94,26],[11,11]],[[22,22],[23,23]],[[33,33],[33,34]]]) # 理解其中的逻辑结构然后开始运行 # 一个基础维度逻辑数据结构中包含一个一个二维数据&#xff0c;二维数组之后再次进行升…

Selenium基础:自动化你的网页交互!

在构建Python爬虫的过程中&#xff0c;你可能会遇到需要与网页进行交互的情况&#xff0c;比如填充表单、点击按钮等。这时&#xff0c;Selenium库就成了你的有力工具。Selenium是一个强大的工具&#xff0c;能够模拟用户在网页上的各种操作。本篇博客将向你介绍Selenium的基础…

EdgeX Foundry 设备服务

文章目录 1.设备服务2.设备配置文件3.设备资源4.资源属性&#xff08;Attributes&#xff09;5.资源属性&#xff08;Properties&#xff09;6.设备命令7.资源操作8.REST 命令端点9.推送事件 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.…

好用的AI模型集合

AI-Chat 这个网站提供的AI-Chat 3.5和AI-Chat 4.0聊天机器人&#xff0c;每天都可以免费使用。 不管是学习、工作还是日常生活&#xff0c;都能给我们带来很大的帮助&#xff0c;效率真的可以说是翻倍了。我觉得&#xff0c;如果你想让自己的生活更加高效、更加有序&#xff0…

WEB漏洞 SSRF简单入门实践

一、漏洞原理 SSRF 服务端请求伪造 原理&#xff1a;在某些网站中提供了从其他服务器获取数据的功能&#xff0c;攻击者能通过构造恶意的URL参数&#xff0c;恶意利用后可作为代理攻击远程或本地的服务器。 二、SSRF的利用 1.对目标外网、内网进行端口扫描。 2.攻击内网或本地的…

Selenium 4.0+ 版本的“正确使用”以及“驱动程序的正确安装”

前言 本文是该专栏的第18篇,后面会持续分享python爬虫干货知识,记得关注。 你是否还在使用selenium 3.0+版本呢?如果还是在使用selenium的旧版本,那就好好看完这篇文章,让你立刻使用上最新的selenium版本——selenium 4.0+版本。 我们都知道selenium是一个开源的Web自动…

python+Selenium以IE模式打开edge浏览器

一、修改ie的注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 下边5个文件夹下的2500的值改成3 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 下边5个文件夹下的2…

全量知识系统问题及SmartChat给出的答复 之12 知识图表设计

Q32. 画一个图表 今天&#xff0c;我们开始设计图表&#xff0c;以便能直观表示前面各种概念名相及其位置关系&#xff0c;发现其中的问题和错误。 先画出一个3*3的表格&#xff0c;还有一根对角线&#xff08;左上到右下&#xff09;&#xff0c;上面有列名&#xff0c;分别…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟&#xff1a;“师兄&#xff0c;我又被鄙视了。说我的系统太差&#xff0c;测试不过关。” 我&#xff1a;“怎么说&#xff1f;” 师弟&#xff1a;“每次发布版本给程夏&#xff0c;都被她发现一些bug&#xff0c;太丢人了。师兄&#xff0c;有什么方法来衡量测试的…

css实现背景渐变叠加

线性渐变效果图: .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#fff 30%),linear-gradient(to right,pink,skyblue);}径像渐变效果图&#xff1a; .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#…

【SVN】使用TortoiseGit删除Git分支

使用TortoiseGit删除Git分支 前言 平时我在进行开发的时候&#xff0c;比如需要开发一个新功能&#xff0c;这里以蘑菇博客开发服务网关-gateway功能为例 一般我都会在原来master分支的基础上&#xff0c;然后拉取一个新的分支【gateway】&#xff0c;然后在 gateway分支上进…

MySQL学生成绩管理系统based on C++ and Clion

mysql_free_result()函数的作用是释放结果集的内存&#xff0c;是同步的&#xff0c;也就是要中断一下 该实验使用了MySQL链接数据库的基本使用方法&#xff0c;具体使用了 MYSQL_RES 数据库的mysql_store_result()函数的返回值是一个结果集&#xff0c;该函数的作用是检索比…

langchain学习笔记(七)

RunnablePassthrough: Passing data through | &#x1f99c;️&#x1f517; Langchain 1、RunnablePassthrough可以在不改变或添加额外键的情况下传递输入。通常和RunnableParallel结合使用去分配数值给到字典的新键 两种方式调用RunnablePassthrough &#xff08;1&#…

FL Studio21编曲制作软件中文版2024最新版本功能详细介绍

一、软件概述 FL Studio 21&#xff0c;全称Fruity Loops Studio 21&#xff0c;是一款功能强大的编曲制作软件&#xff0c;被广泛应用于音乐创作、编曲、录音、混音和后期制作等领域。其中文版为中国的音乐制作人和爱好者提供了更加便捷的操作体验。 FL Studio 21 Win-安装包…

探索ECMAScript语法的深度奥秘

随着现代Web应用的崛起&#xff0c;ECMAScript&#xff08;简称ES&#xff09;成为了前端开发者的必备利器。ECMAScript定义了JavaScript的语法和基本结构&#xff0c;是JavaScript的标准规范。本文将深入探讨ECMAScript语法的一些精妙之处&#xff0c;为读者揭示其中的深度奥秘…