蓝桥杯练习题——二分

news2024/9/29 17:36:26

1.借教室

在这里插入图片描述

思路

1.随着订单的增加,每天可用的教室越来越少,二分查找最后一个教室没有出现负数的订单编号
2.每个订单的操作是 [s, t] 全部减去 d

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
int d[N], s[N], t[N], a[N];
long long b[N]; 
int n, m;

int check(int mid){
    memset(b, 0, sizeof(b));
    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] > a[i]) return 0;
    }
    return 1;
}

int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= m; i++) scanf("%d%d%d", &d[i], &s[i], &t[i]);
    int l = 0, r = m + 1;
    while(l + 1 < r){
        int mid = (l + r) / 2;
        if(check(mid)) l = mid;
        else r = mid;
    }
    // 此时 r 为第一个不满足的编号
    if(r == m + 1) printf("0");
    else printf("-1\n%d", r);
    return 0;
}

2.分巧克力

在这里插入图片描述

思路

二分巧克力边长,注意长和宽都要除以 mid,防止出现 1 * 100 除以 2 * 2的情况

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N], w[N];
int n, k;

int check(int mid){
    int sum = 0;
    for(int i = 1; i <= n; i++){
        // 注意:比如 1 * 100,mid 为 2,不可分
        sum += (h[i] / mid) * (w[i] / mid);
    }
    if(sum >= k) return 1;
    else return 0;
}

int main(){
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++) scanf("%d%d", &h[i], &w[i]);
    int l = 0, r = 1e5 + 1;
    while(l + 1 < r){
        int mid = (l + r) / 2;
        if(check(mid)) l = mid;
        else r = mid;
    }
    printf("%d", l);
    return 0;
}

3.管道

在这里插入图片描述

思路

1.二分最早打开的时间
2.合并已经打开的区间

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
pair<int, int> q[N]; // 存储左右端点
int L[N], S[N];
int n, len;

int check(int mid){
    int cnt = 0;
    for(int i = 0; i < n; i++){
        if(mid >= S[i]){
            // 延伸出去的距离
            int t = mid - S[i];
            int l = max(1, L[i] - t), r = min(1ll * len, 1ll * L[i] + t);
            q[cnt++] = make_pair(l, r);
        }
    }
    //区间合并
    sort(q, q + cnt);
    int st = -1, ed = -1;
    for(int i = 0; i < cnt; i++){
        if(ed + 1 >= q[i].first) 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 = 0; i < n; i++) scanf("%d%d", &L[i], &S[i]);
    int l = 0, r = 2e9 + 1;
    while(l + 1 < r){
        int mid = (1ll * l + r) / 2;
        if(check(mid)) r = mid;
        else l = mid;
    }
    printf("%d", r);
    return 0;
}

4.技能升级

在这里插入图片描述

思路

1.多路归并,把所有等差数列放在一个数组,从大到小排序,选前 m 个数
2.大于等于 x 的个数一定大于等于 m 个,二分 x,x 为从大到小排名为 m 的数
3.每个数列大于等于 x 的个数为 (a - x) / b + 1
4.每个数列大于等于 x 的总和为 (首项 + 末项) * 项数 / 2

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n, m;

// 判断大于等于 mid 的个数,是否大于等于 m
int check(int mid){
    long long cnt = 0;
    for(int i = 0; i < n; i++){
        if(a[i] >= mid) cnt += (a[i] - mid) / b[i] + 1;
    }
    return cnt >= m;
}

int main(){
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]);
    int l = 0, r = 1e6 + 1;
    while(l + 1 < r){
        int mid = (l + r) / 2;
        if(check(mid)) l = mid;
        else r = mid;
    }
    long long sum = 0, cnt = 0;
    for(int i = 0; i < n; i++){
        if(a[i] >= l){
            // 计算项数
            int c = (a[i] - r) / b[i] + 1;
            // 计算末项
            int ed = a[i] - b[i] * (c - 1);
            // 等差数列求和
            sum += 1ll * (a[i] + ed) * c / 2;     
            // 计算有多少项,可能有多余
            cnt += c;
        }
    }
    // 减去多余的项
    printf("%lld", sum - (cnt - m) * l);
    return 0;
}

5.冶炼金属

在这里插入图片描述

思路

方法1:二分左右边界
方法2:推导公式,a / x >= b,a / x < (b + 1);

// 方法1
#include<iostream>
using namespace std;
const int N = 1e4 + 10;
int a[N], b[N];
int n;

// 找到最大值
int check1(int mid){
    for(int i = 0; i < n; i++){
        if(a[i] / mid < b[i]) return 0;
    }
    return 1;
}

// 找到最小值
int check2(int mid){
    for(int i = 0; i < n; i++){
        if(a[i] / mid > b[i]) return 0;
    }
    return 1;
}

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]);
    int l = 0, r = 1e9 + 1;
    while(l + 1 < r){
        int mid = (l + r) / 2;
        if(check1(mid)) l = mid;
        else r = mid;
    }
    int res1 = l;
    l = 0, r = 1e9 + 1;
    while(l + 1 < r){
        int mid = (l + r) / 2;
        if(check2(mid)) r = mid;
        else l = mid;
    }
    int res2 = r;
    printf("%d %d", res2, res1);
    return 0;
}

// 方法2
#include<iostream>
using namespace std;
const int N = 1e4 + 10;
int a, b;
int n;

int main(){
    scanf("%d", &n);
    int res1 = 1, res2 = 1e9;
    for(int i = 0; i < n; i++){
        scanf("%d%d", &a, &b);
        res1 = max(res1, a / (b + 1) + 1);
        res2 = min(res2, a / b);
    }
    printf("%d %d", res1, res2);
    return 0;
}

6.数的范围

在这里插入图片描述

思路

二分左右边界

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n, q;

// 找最小值
int check1(int mid, int k){
    return a[mid] < k;
}

// 找最大值
int check2(int mid, int k){
    return a[mid] <= k;
}

int main(){
    scanf("%d%d", &n, &q);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    int k;
    while(q--){
        scanf("%d", &k);
        int l = -1, r = n;
        while(l + 1 < r){
            int mid = (l + r) / 2;
            if(check1(mid, k)) l = mid;
            else r = mid;
        }
        int res1 = r;
        l = 0, r = n;
        while(l + 1 < r){
            int mid = (l + r) / 2;
            if(check2(mid, k)) l = mid;
            else r = mid;
        }
        int res2 = l;
        if(a[res1] == k && a[res2] == k) printf("%d %d\n", res1, res2);
        else printf("-1 -1\n");
    }
    return 0;
}

7.最佳牛围栏

在这里插入图片描述

思路

1.二分平均值,每个数先减去平均值,转化成是否存在长度大于等于 f 的非零子段和
2.舍去很小的前缀和,保留大的前缀和

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
double a[N], s[N];
int n, f;

int check(double mid){
    double res = 1e9, ans = -1e9;
    for(int i = f; i <= n; i++){
        // 可以舍去的前缀和
        res = min(res, s[i - f]);
        // 保留的前缀和
        ans = max(ans, s[i] - res);
    }
    return ans >= 0;
}

int main(){
    scanf("%d%d", &n, &f);
    for(int i = 1; i <= n; i++){
        scanf("%lf", &a[i]);
    }
    double l = 0, r = 2001;
    while(l + 1e-5 < r){
        double mid = (l + r) / 2;
        for(int i = 1; i <= n; i++){
            s[i] = s[i - 1] + a[i] - mid;
        }
        if(check(mid)) l = mid;
        else r = mid;
    }
    // l + 1e-5 = r
    int ans = r * 1000;
    printf("%d", ans);
    return 0;
}

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

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

相关文章

Linux之相对路径、绝对路径、特殊路径符

相对路径和绝对路径 cd /root/temp 绝对路径写法 cd temp 相对路径写法 1、绝对路径&#xff1a;以根目录为起点&#xff0c;描述路径的一种写法&#xff0c;路径描述以 / 开头。 2、相对路径&#xff1a;以当前目录为起点&#xff0c;路径描述无需以 / 开头。 特殊路径符 如…

cRIO9040中NI9871模块的测试

硬件准备 CompactRIO9040NI9871直流电源&#xff08;可调&#xff09;网线RJ50转DB9线鸣志STF03-R驱动器和步进电机 软件安装 参考&#xff1a;cRIO9040中NI9381模块的测试 此外&#xff0c;需安装NI-Serial 9870和9871扫描引擎支持 打开NI Measurement&#xff06;Automa…

C++之set、multiset

1、set简介 set是一种关联式容器&#xff0c;包含的key值唯一&#xff0c;所有元素都会在插入时自动被排序&#xff0c;其存储结构为红黑树。set只能通过迭代器(iterator)访问。 set和multiset的区别&#xff1a; &#xff08;1&#xff09;set不允许容器中有重复的元素&…

C++_程序流程结构_选择结构_if

程序流程结构 C/C支持最基本的三种程序运行结构&#xff1a;顺序、选择、循环结构 顺序结构&#xff1a;程序按顺序执行&#xff0c;不发生跳转选择结构&#xff1a;依据条件是否满足&#xff0c;有选择地执行相应功能循环结构&#xff1a;依据条件是否满足&#xff0c;循环多…

跟 AI 学 StarRocks:简介

因为要支持公司的 BI 建设&#xff0c;团队引入了 StarRocks 数据库&#xff0c;此前我没有了解过此项技术&#xff0c;不过因为有架构师引入了此项技术栈&#xff0c;就顺便学习一下。 一、什么是 MPP 数据库&#xff1f; MPP 数据库指的是大规模并行处理&#xff08;Massiv…

zotero | 多平台同步 | 坚果云

zotero注册登陆 打开zotero软件&#xff0c;mac电脑打开首选项&#xff0c;如下图所示&#xff1a; 然后点击同步选项&#xff0c;如下图所示&#xff0c;如果已经有账号&#xff0c;请登陆账号&#xff0c;无则注册账号之后再登陆&#xff1b; 注册坚果云账号 注册完坚果…

QT6 libModbus 用于ModbusTcp客户端读写服务端

虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能&#xff0c;也可移植到各种平台。 性能&#xff1a;读1次和写1次约各用时2ms。 分别创建了读和写各1个连接指针&#xff0c;用于读100个寄存器和写100个寄存器&#xff0c;读写分离。 客户端&am…

文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

三、设计 LCS-LENGTH的带备忘的版本&#xff0c;运行时间为O(mn)。需要写代码的时候&#xff0c;请用go语言。 文心一言&#xff0c;代码正常运行&#xff1a; LCS-LENGTH&#xff08;Longest Common Subsequence Length&#xff09;问题的带备忘的版本通常指的是使用动态规划…

备考2024年小学生古诗文大会:历年真题15题练习和独家解析

如何提高小学生古诗词的知识&#xff1f;如何激发小学生古诗词的学习兴趣&#xff1f;如何提高小学古诗词的学习成绩&#xff1f;如何备考2024年小学生古诗文大会&#xff1f;... 如果你也在关注这些问题&#xff0c;我的建议是参加每年一度的小学生古诗词大会&#xff08;免费…

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

更新内容&#xff1a; 更新 SmartX 超融合在期货行业的覆盖范围、部署规模与应用场景。新增 CTP 主席系统实践与评测、容器云资源池等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎下载阅读电子书《SmartX 金融核心生产业务场景探索文章合集》。 面对不断变…

云计算与大数据课程笔记(一)云计算背景与介绍

如何实现一个简易搜索引擎&#xff1f; 实现一个简易的搜索引擎可以分为几个基本步骤&#xff1a;数据收集&#xff08;爬虫&#xff09;、数据处理&#xff08;索引&#xff09;、查询处理和结果呈现。下面是一个概括的实现流程&#xff1a; 1. 数据收集&#xff08;爬虫&am…

Android和Linux的嵌入式开发差异

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

vue实现水印功能

目录 一、应用场景 二、实现原理 三、详细开发 1.水印的实现方式 2.防止用户通过控制台修改样式去除水印效果&#xff08;可跳过&#xff0c;有弊端&#xff09; 3.水印的使用 &#xff08;1&#xff09;单页面/全局使用 &#xff08;2&#xff09;全局使用个别页面去掉…

MySQL 常用优化方式

MySQL 常用优化方式 sql 书写顺序与执行顺序SQL设计优化使用索引避免索引失效分析慢查询合理使用子查询和临时表列相关使用 日常SQL优化场景limit语句隐式类型转换嵌套子查询混合排序查询重写 sql 书写顺序与执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM &…

18.题目:编号760 数的计算

题目&#xff1a; ###该题主要考察递推、递归 将该题看成若干个子问题 #include<bits/stdc.h> using namespace std; const int N20; int a[N];int dfs(int dep){int res1;for(int i1;i<a[dep-1]/2;i){a[dep]i;resdfs(dep1);}return res; }int main(){int n;cin>…

论文阅读_代码生成模型_CodeLlama

英文名称: Code Llama: Open Foundation Models for Code 中文名称: Code Llama&#xff1a;开放基础代码模型 链接: https://arxiv.org/abs/2308.12950 代码: https://github.com/facebookresearch/codellama 作者: Baptiste Rozire, Jonas Gehring, Fabian Gloeckle, Sten So…

React的fiber原理

在读完这篇文章之后&#xff0c;大家可以回到文章开头再捋一下以下几个关键词&#xff0c;将React的 Fiber架构原理彻底搞清楚。 关键词&#xff1a; requestIdleCallback、IdleDeadlineFiber&#xff1a;React的一个执行单元 在Fiber 出现之前&#xff0c;React存在什么问题…

bxCAN总线Loopback功能实现(STM32F4xx)

目录 概述 1 认识bxCAN Loopback 1.1 环回模式 1.2 环回模式特点 2 使用STM32CubeMX 生成工程 2.1 参数配置 2.2 生成工程代码 2.4 了解can.c 3 认识Hal库中的bxCAN 3.1 认识3个重要数据结构 3.2 函数组 3.2.1 初始化函数组 3.2.2 控制函数组 3.2.3 中断管理函数…

【风格迁移】pix2pixHD:高分辨率图像生成

pix2pixHD&#xff1a;高分辨率图像生成 提出背景问题1: 如何提高生成图像的照片级真实感和分辨率&#xff1f;问题2: 如何利用实例级别的对象语义信息进一步提高图像质量&#xff1f;问题3: 如何实现图像合成的多模态性&#xff0c;允许交互式对象编辑&#xff1f; pix2pixHD …

【STK】手把手教你利用STK进行仿真-STK软件基础01 STK的对象组织模式

STK系统采用面向对象和分级组织结构的管理模式对仿真对象进行管理&#xff0c;这种组织二行管理模式非常符合人类的认知习惯&#xff0c;易于理解。STK最基本的对象为场景&#xff08;Scenario&#xff09;&#xff0c;在场景中可以面向对象和分级组织模式对各场景中的仿真对象…