蓝桥杯备赛之二分专题

常用的算法二分模板

1. 在数组a[]中找大于等于x的第一个数的下标

//int ans = lower_bound(a, a + n, x) - a
//相当于下方
int l = 0, r = n - 1;
while(l < r) {
    int mid = l + r >> 1;
    if(a[mid] >= x)	r = mid;
    else l = mid + 1;
}
cout << r;

2. 在数组a[]中找大于x的第一个数的下标

//int ans = upper_bound(a, a + n, x) - a
//相当于下方
int l = 0, r = n - 1;
while(l < r) {
    int mid = l + r + 1 >> 1;
    if(a[mid] <= x) l = mid;
    else r = mid + 1;
}
cout << r;

例题

503.借教室

题目

在这里插入图片描述

在这里插入图片描述

思路

二分_借教室.png

代码
//根据题意:有单调性,区间操作  二分+差分
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int r[N], d[N], s[N], t[N];
LL b[N];    //差分数组
int n, m;
bool check(int mid) {
    for(int i = 1; i <= n; i++) 
        b[i] = r[i] - r[i - 1]; //初始化差分数组
    for(int i = 1; i <= mid; i++) {
        b[s[i]] -= d[i];
        b[t[i] + 1] += d[i];
    }
    for(int i = 1; i <= n; i++ ) {
        b[i] += b[i - 1];
        if(b[i] < 0)    return true;
    }
    return false;
}
int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &r[i]);
    for(int i = 1; i <= m; i++) scanf("%d%d%d", &d[i], &s[i], &t[i]);
    int l = 1, r = m;
    if(!check(m)) {
        puts("0");
        return 0;
    }
    while(l < r) {
        int mid = l + r >> 1;
        if(check(mid))  r = mid;
        else l = mid + 1;
    }
    printf("-1\n%d", r);

    return 0;
}

5407.管道

题目

在这里插入图片描述

代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
typedef long long LL;
int n, len;
int l[N], s[N];
pair<int, int> q[N];
bool check(LL mid) {    //mid为当前时间
    int cnt = 0;
    for(int i = 1; i <= n; i++) {
        if(s[i] <= mid)  {
            // q[cnt++] = {mid - s[i], mid + s[i]};    别忘了区间长度限制
            int d = mid - s[i];
            LL L = max(1, l[i] - d), R = min((LL)len, (LL)l[i] + d);
            q[cnt++] = {L, R};
        }
    }
    
    sort(q, q + cnt);
    int st = -1, ed = -1;
    for(int i = 0; i < cnt; i++) {
        //这里是 ed+1 因为需要的是每个节点有水,相当于“相连”
        if(q[i].first <= ed + 1)    ed = max(ed, q[i].second);
        else {
            st = q[i].first, ed = q[i].second;
        }
    }
    
    return st == 1 && ed == len;
}
int main() {
    scanf("%d%d", &n, &len);
    for(int i = 1; i <= n; i++)
        scanf("%d%d", &l[i], &s[i]);
    LL l = 0, r = 2e9;      //最坏情况是2e9
    while(l < r) {
        LL mid = l + r >> 1;
        if(check(mid))  r = mid;
        else l = mid + 1;
    }
    cout << r;
    return 0;
}

(多路合并)

1262.鱼塘钓鱼

在这里插入图片描述

思路

在这里插入图片描述

枚举最后一次钓鱼的鱼塘, 传入参数(第k个鱼塘, 钓鱼时间)

代码如下
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110;
int T, n;
int s[N], d[N], t[N], spend[N];  
int get_fish(int k) {   //在第k个鱼塘当前能钓鱼数量
    return max(0, s[k] - spend[k] * d[k]);
}
int work(int n, int T) {
    int res = 0;
    memset(spend, 0, sizeof spend);
    for(int i = 0; i < T; i++) {    //一共枚举T次,T分钟则可选择钓T次
        int t = 1;  //循环判断哪个鱼塘当前能钓鱼数最多
        for(int j = 2; j <= n; j++)
            if(get_fish(j) > get_fish(t))
                t = j;
        res += get_fish(t);  //答案加上此时钓鱼数量
        spend[t]++;     //当前鱼塘钓鱼时间++
    }
    return res;
}
int main () {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)  scanf("%d", &s[i]);
    for(int i = 1; i <= n; i++)  scanf("%d", &d[i]);    
    //走到第一个鱼塘不用时间
    for(int i = 2; i <= n; i++) cin >> t[i], t[i] += t[i - 1];
    cin >> T;
    int res = 0;
    // 枚举最后走到哪个鱼塘
    for(int i = 1; i <= n; i++) 
        res = max(res, work(i, T - t[i]));  //最后走到第i个鱼塘,钓鱼时间为T-t[i]
    cout << res;
    return 0;
}
4656.技能升级
题目:

在这里插入图片描述

思路分析:

在这里插入图片描述

在这里插入图片描述

代码和注释具体如下
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, m;
int a[N], b[N];
bool check(int mid) {
    LL res = 0;
    for(int i = 0; i < n; i++)
        if(a[i] >= mid)
            res += (a[i] - mid) / b[i] + 1; //对于第i个技能所加的次数 :差值 / 公差 + 1,因为差值为0时,还需要加一次
    if(res >= m)  return true;    //判断对于最后一次为mid值所对应加技能的总次数是否满足要求m次
    return false;
}
int main() {
    scanf("%d%d", &n, &m);
    //m 的范围太大, 故从n下手,也就是枚举加的技能点值,二分答案
    for(int i = 0; i < n; i++)  scanf("%d%d", &a[i], &b[i]);
    int l = 0, r = 1e6;     //左右边界(最后一次(m)加的技能点)
    while(l < r) {
        // l 和 r 的更新,***关键***
        //这里的话由于所加技能点是从大到小排序进行选择的,故答案必然是[mid,...]的区间(mid对应的值可能不止一个),而小于mid的不符合
        int mid = l + r + 1 >> 1;
        if(check(mid))  l = mid;
        else r = mid - 1;
    }
    LL res = 0, cnt = 0;    //次数,答案
    for(int i = 0; i < n; i++) {
        if(a[i] > r) {  // r 即为最后一次加的技能点数
            int s = (a[i] - r) / b[i] + 1;  //第i个技能所加次数
            int an = a[i] - (s - 1) * b[i]; //最后一次升级的点数
            res += (LL)(a[i] + an) * s / 2;     //等差数列公式求出所加技能点和
            cnt += s;   //累加加技能次数
        }
    }
    LL ans = res - (cnt - m) * r;   //最后一个数值可能加的次数不止一次,故需要特殊处理
    cout << ans;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

间隔5分钟执行1次Python脚本设置步骤 —— 定时执行专家

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件&#xff0c;用于在 Windows 系统上定时执行各种任务&#xff0c;包括执行脚本或程序。 下面是使用 "定时执行专家" 软件设置定时执行 Python 脚本的步骤&#xff1a; 步骤 1: 设置 P…

图遍历算法

图的遍历算法有两种&#xff1a;深度优先遍历、广度优先遍历算法。 深度优先遍历算法就是从起始结点开始&#xff0c;只要有相邻且未被访问的结点就要直接进行访问&#xff0c;直到最后不能向下遍历为止&#xff0c;再回溯寻找下一个策略。 广度优先遍历算法&#xff0c;就是从…

像SpringBoot一样使用Flask - 1.新建一个Flask项目

感谢各位对上一篇文章的喜爱&#xff0c;从事10年开发&#xff0c;希望借此可以简单实操下从SpringBoot到Flask的转型&#xff0c;少走一点弯路&#xff0c;多花一点时间在处理实际问题。 一、用pycharmConda新建一个Flask项目 二、得到一个Flask项目 三、运行起来访问下&#…

Spring Boot中实现图片上传功能的两种策略

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

selenium也能过某数、5s盾..

文章转载于&#xff1a;selenium也能过某数、5s盾… 直接安装: pip install undetected_chromedriver运行代码&#xff1a; import undetected_chromedriver as uc import timedriver uc.Chrome(executable_pathrC:\Users\chromedriver.exe,version_main111) driver.get(网…

单链表的实现(数据结构)

本篇博客主要是单链表&#xff08;无头单项不循环&#xff09;的实现的代码分享 说明&#xff1a;因为此单链表无头&#xff08;哨兵位&#xff09;&#xff0c;可以说成没有初始化也可以说初始化时没有一个有效地址作为单链表的起始地址 例如下面代码中的plist NULL。 所以在…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO&#xff1a;DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而&#xff0c;由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外&#xff0c;在训练的早期阶段匹配的不稳定性会…

iStoreOS系统内安装HomeAssistant服务

iStoreOS系统内安装HomeAssistant服务 1. HomeAssistant服务 HomeAssistant是一款基于Python的开源智能家居系统&#xff0c;简称HA。 HomeAssistant可以方便地连接各种外部设备&#xff0c;如智能设备、摄像头、邮件、短消息和云服务等&#xff0c;其成熟的可连接组件有近千…

【重温设计模式】迭代器模式及其Java示例

迭代器模式的介绍 在编程领域&#xff0c;迭代器模式是一种常见的设计模式&#xff0c;它提供了一种方法&#xff0c;使得我们可以顺序访问一个集合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。你可以把它想象成一本书&#xff0c;你不需要知道这本书是怎么印…

最佳牛围栏(二分 + 前缀和)

最佳牛围栏 原题链接&#xff1a;https://www.acwing.com/problem/content/104/ 题目 思路 我们发现若是枚举答案的话&#xff0c;那么我们判断是否存在一个平均值大于等于mid&#xff0c;如果最优解是x&#xff0c;那么mid < x的时候&#xff0c;必然可以找到一段&#x…

二十七 超级数据查看器 讲解稿 APP的用途 能做什么

二十七 超级数据查看器 讲解稿 APP的用途 能做什么 ​ 点击此处 访问B站 以新页面观看教学视频 点击此处 访问豌豆荚 下载APP 讲解稿全文: 大家好&#xff0c;今天我们讲一下超级数据查看器 的用途 也就是讲软件有什么用&#xff0c;能做什么&#xff0c;应用场景&#xff0…

mongo和redis的数据备份和还原

redis 安装 Redis安装和基本使用&#xff08;windows版&#xff09; - 知乎 window环境下Redis7服务器的安装和运行_redis7 windows-CSDN博客 备份数据 Redis SAVE 命令用于创建当前数据库的备份。 该命令将在 redis 安装目录中创建dump.rdb文件 查询路径 CONFIG GET dir…

SAR ADC学习笔记(4)

CDAC电容阵列 一、电容失配 二、电容失配对CDAC线性度的影响 1.电容失配对DNL的影响 2.电容失配对INL的影响 三、分段结构的CDAC 四、CDAC开关切换方案&#xff1a;传统开关切换策略 第一次比较阶段&#xff1a;如果VP(1)-VN(1)<0 第一次比较阶段&#xff1a;如果VP(1)-VN…

金融行业专题|基金超融合架构转型与场景探索合集(2023版)

更新内容 更新 SmartX 超融合在基金行业的覆盖范围、部署规模与应用场景。更新信创云资源池、关键业务系统性能优化等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎下载阅读电子书《金融核心生产业务场景探索文章合集》。 随着数字化经济的蓬勃发展&#xf…

(学习总结)如何使用ChatGPT API训练自定义知识库

第一步&#xff1a; 安装OpenAI、GPT Index、PyPDF2和Gradio库 pip install openai pip install gpt_index pip install PyPDF2 pip install gradio 第二步&#xff1a;用VScode代码编辑器写app.py代码 记得替换api密钥 from llama_index import SimpleDirectoryReader, …

Cloud-Eureka服务治理-Ribbon负载均衡

构建Cloud父工程 父工程只做依赖版本管理 不引入依赖 pom.xml <packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEA…

DFS回溯-经典全排列问题(力扣)

前言 对于全排列问题&#xff0c;常用的做法是设置一个vis数组来确定位置i上的数字是否被访问&#xff0c;因为是全排列问题&#xff0c;所以不同的顺序也是不一样的排列&#xff0c;因此每次都是从起点开始询问**(注意起点到底是0还是1)** 46全排列(最简单的模板) class So…

Solidworks界面左边FeatureManager/设计树/模型树/树区域/零件树/零件栏不见了

Solidworks界面左边FeatureManager/设计树/模型树/树区域/零件树/零件栏不见了&#xff0c;按F9还原/隐藏&#xff0c;有的笔记本按FnF9

Gin 获取请求参数

POST 请求参数 Gin 获取Post请求URL参数有三种方式 func (c *Context) PostForm(key string) string func (c *Context) DefaultPostForm(key, defaultValue string) string func (c *Context) GetPostForm(key string) (string, bool)大多数情况下使用的是application/x-www…

ffmpeg maxrate 导致转码输出的内容包含随机性

https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate 问题 领导提出了一个问题&#xff0c;为什么转码后的视频大小字节数据都不一样&#xff0c;这问到我了&#xff0c;一时语塞。查一下吧&#xff0c;没有什么资料支撑。主动试一下。 尝试 首先尝试一下直接…