2024.6.2练习情况—整数二分

2024.6.2练习情况—整数二分

一、例题Acwing789.数的范围

题目

        

代码

#include<iostream>

#include<cstring>

using namespace std;

const int N = 100100;

int n,q,k;//题中变量

int arr[N];

//找左端点

void querryleft(int arr[],int k){

        int l=0,r=n-1;

       

        while(l<r){

                int mid=(l+r)/2;

                if(arr[mid] >= k){

                        r=mid;

                }

                else l=mid+1;

        }

        if(arr[l]==k){

                printf("%d ",l);

        }     

        else printf("-1 ");

        return;

}

//找右端点

void querryright(int arr[],int k){

        int l=0,r=n-1;

       

        while(l<r){

                int mid=(l+r+1)/2;

                if(arr[mid] <= k){

                        l=mid;

                }

                else r=mid-1;

        }

        if(arr[l]==k){

                printf("%d\n",l);

        }     

        else printf("-1\n");

        return;

}

int main()

{

        cin>>n>>q;

        for(int i=0;i<n;i++){

                scanf("%d",&arr[i]);

        }

        while(q--){

                cin>>k;

                //要求左端点和右端点,若不存在则输出-1

                querryleft(arr,k);

                querryright(arr,k);

        }

        return 0;

}

模板核心代码

//代码2:左端点绿色

int l=0,r=n;

while(l<r){

    int mid = l+r >> 1;

    if(check()){

        r = mid;

    }

    else l = mid + 1;

}

//代码2:右端点

int l=0,r=n;

while(l < r){

    int mid = (l+r+1) >> 1;

    if(check()){

        l = mid;

    }

    else r = mid - 1;

}

运行评判结果

总结:

        完全独立完成。我自己总结了一个整数二分口诀:左端大右,右端小左。要使用二分模板求数段的左端点时,if(check())中的check条件是arr[mid]大于等于被查找数k,并且将右端点缩小,即r=mid;求右端点同理。

二、洛谷P2249 【深基13.例1】查找

题目

  1. 分析

        完全独立完成。题中给出的非负整数序列是单调不减的,并且要求输出要访问数字q在序列中第一次出现的编号。考虑到使用整数二分中求左端点的模板。

代码

#include<iostream>

#include<cstring>

using namespace std;

const int N = 100000010;

int n,q,k;//题中变量

int arr[N];

void querryleft(int arr[],int k){

        int l=0,r=n-1;

       

        while(l<r){

                int mid=(l+r)/2;

                if(arr[mid] >= k){

                        r=mid;

                }

                else l=mid+1;

        }

        if(arr[l]==k){

                printf("%d ",l+1);

        }     

        else printf("-1 ");

        return;

}

int main()

{

        cin>>n>>q;

        for(int i=0;i<n;i++){

                scanf("%d",&arr[i]);

        }

        while(q--){

                cin>>k;

                //要求左端点,若不存在则输出-1

                querryleft(arr,k);

        }

        return 0;

 }

运行评判结果

三、洛谷P1102 A-B 数对

题目

分析

思路1:题目中给出的是一串正整数数列,注意序列是一组顺序排列的东西,若这些东西是数,我们便称之为数列。这道题我的第一想法是用另开一个数组nums,记录每个数字的个数,将A-B=C的形式转成A=B+C,也就是求nums[A]的个数。因为题中说不同位置的数字一样的数对算不同的数对,所以直接循环一遍原数组将nums[A]相加就行。

思路2:学习CSDN上的方法,运用二分知识,先对所有数字排序,然后用一个循环去枚举 A ,枚举A之后呢,就能算出 B = A - C,然后我们只需要知道B的个数即可。用二分知识找到一个数字的起始位置l和终止位置r,那么数字个数就是len = r - l + 1,如果没有找到得到的数量应该是0。然后再把所有的数字加起来即可。

代码

代码1:

#include<algorithm>

#include<iostream>

using namespace std;

long long n,c;

long long a[100000000];

long long nums[1000010];

long long cnt;

int main()

{

        scanf("%lld%lld",&n,&c);

        for(int i=0;i<n;i++){

                scanf("%d",&a[i]);

    nums[a[i]] ++;

        }

        sort(a,a+n);

        for(int i=0;i<n;i++){

                                cnt += nums[a[i] + c];

        }

        printf("%lld",cnt);

        return 0;

 } 

代码2:

#include<iostream>

#include<cstring>

#include<algorithm>

using namespace std;

const int N = 200010;

long long ans = 0;

int arr[N];

int n,c;

//找左端点

int solve1(int x) {

        int l = 1, r = n;

        while (l < r) {

                int mid = (l + r)/2;

                if (arr[mid] >= x) r = mid;

                else l = mid + 1;

        }

        if (arr[l] != x)return -1;

        return l;

}

//找右端点

int solve2(int x) {

        int l = 1, r = n;

        while (l < r) {

                int mid = (l + r + 1)/2;

                if (arr[mid] <= x) l = mid;

                else r = mid - 1;

        }

        if (arr[l] != x) return -1;

        return l;

}

int main() {

        cin>>n>>c;

        for (int i = 1; i <= n; i++) {

                cin>>arr[i];

        }

        sort(arr + 1, arr + 1 + n);

       

        for (int i = 1; i <= n; i++) {// 因为不同位置的数字一样的数对算不同的数对

                int x = arr[i] - c;

                if (x < 1) continue;//如果满足条件的x小于1,则说明不x在数列中

                int l = solve1(x);

                if (l == -1) continue;//如果在数列中 不存在x使得a[i]-x=c,continue

                int r = solve2(x);

                int len = r - l + 1;

                ans += len;

        }

        printf("%lld\n", ans);

        return 0;

}

运行评判结果

结果1

结果2

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

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

相关文章

list~模拟实现

目录 list的介绍及使用 list的底层结构 节点类的实现 list的实现 构造函数 拷贝构造 方法一&#xff1a;方法二&#xff1a; 析构函数 赋值重载 insert / erase push_/pop_(尾插/尾删/头插/头删) begin和end&#xff08;在已建立迭代器的基础上&#xff09; 迭代…

React@16.x(17)Portals

目录 1&#xff0c;使用2&#xff0c;事件冒泡 一句话总结&#xff1a;和 Vue3 的 Teleport 一个效果。 1&#xff0c;使用 import React, { PureComponent } from "react"; import ReactDOM from "react-dom";// 返回一个 React 元素&#xff08;ReactNo…

基于Cortex的MCU设计

基于Cortex的MCU设计 今日更新的存货文档&#xff0c;发现日更文章还是很花时间的。保证一周更新三篇文章就行啦&#xff0c;本篇文章的内容起始主要取自于《Cortex-M3 权威指南》和知网下载的论文。写的不详细&#xff0c;想进一步了解的就去看这篇文档或网上找别的资料&#…

爬虫利器Frida RPC入门——夜神模拟器环境篇

Frida是一款轻量级HOOK框架&#xff0c;可用于多平台上&#xff0c;例如android、windows、ios等。 frida分为两部分&#xff0c;服务端运行在目标机上&#xff0c;通过注入进程的方式来实现劫持应用函数&#xff0c;另一部分运行在系统机器上。frida上层接口支持js、python、…

香橙派 AIpro开发体验:使用YOLOV8对USB摄像头画面进行目标检测

香橙派 AIpro开发体验&#xff1a;使用YOLOV8对USB摄像头画面进行目标检测 前言一、香橙派AIpro硬件准备二、连接香橙派AIpro1. 通过网线连接路由器和香橙派AIpro2. 通过wifi连接香橙派AIpro3. 使用vscode 通过ssh连接香橙派AIpro 三、USB摄像头测试1. 配置ipynb远程开发环境1.…

C语言:(动态内存管理)

目录 动态内存有什么用呢 malloc函数 开辟失败示范 free函数 calloc函数 realloc函数 当然realooc也可以开辟空间 常⻅的动态内存的错误 对NULL指针的解引⽤操作 对动态内存开辟的空间越界访问 对⾮动态开辟内存使⽤free释放 使⽤free释放⼀块动态开辟内存的⼀部分 …

Mac逆向Electron应用

工具库 解压asar文件 第一步 找到应用文件夹位置 打开活动监视器&#xff1a; 搜索相关应用 用命令行打开刚才复制的路径即可 open Applications/XXX.app/Contents/Resources/app第二步 解压打包文件 解压asar文件

[深度学习]yolov10+deepsort+pyqt5实现目标追踪

YOLOv10DeepSORTPyQt5实现目标追踪系统 在现代智能监控系统中&#xff0c;目标追踪技术扮演着至关重要的角色。结合YOLOv10&#xff08;一种先进的实时目标检测算法&#xff09;与DeepSORT&#xff08;一种多目标追踪算法&#xff09;&#xff0c;并通过PyQt5构建用户界面&…

StretchSense:将手部动作无缝集成到Xsens全身动捕系统中

在动画制作中逼真的手部动作可以大幅提升角色的情感表现能力&#xff0c;这将使观众更加轻易的走进角色&#xff0c;感受角色的情感变化并更加快速的了解角色的性格特点。如性格外向的角色将拥有更加复杂的手部动作表达。因此有效加强角色的手部动画真实度有助于吸引更多的观众…

element table表格行列合并span-method,根据数据动态行列合并

表格行列合并需要用到 table的方法 span-method 根据数据来进行动态的行列合并&#xff0c;实例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

PCIe的链路状态

目录 概述 链路训练的目的 两个概念 下面介绍LTSSM状态机 概述 PCie链路的初始化过程较为复杂&#xff0c;Pcie总线进行链路训练时&#xff0c;将初始化Pcie设备的物理层&#xff0c;发送接收模块和相关的链路状态信息&#xff0c;当链路训练成功结束后&#xff0c;PCIe链…

xcode开发swift允许发送http请求设置

Xcode 现在新建项目默认只支持HTTPS请求&#xff0c;认为HTTP请求不安全&#xff0c;所以不支持。但是开发环境一般都是http模式&#xff0c;所以需要单独配置才可以访问。 需要到项目的设置里面&#xff0c;点击info&#xff0c;如果没有App Transport Security Setting这一项…

c# - - - winform 右下角气球提示通知

c# - - - winform 右下角气球提示通知 winform 右下角气球提示通知 1.1 winform 右下角气球提示通知 在工具箱中点击 NotifyIcon 控件&#xff0c;拖动到 Form1 窗体上添加这个控件。 在“提示”按钮的点击事件中写气球提示通知内容。 public partial class Form1 : Form {…

民国漫画杂志《时代漫画》第29期.PDF

时代漫画29.PDF: https://url03.ctfile.com/f/1779803-1248635405-bf3c87?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

《探索Stable Diffusion:AI绘画的创意之路与实战秘籍》

《Stable Diffusion AI 绘画从提示词到模型出图》介绍了 Stable Diffusion AI 绘画工具及其使用技巧。书中内容分为两部分&#xff1a;“基础操作篇”&#xff0c;讲解了 SD 文生图、图生图、提示词、模型、ControlNet 插件等核心技术的应用&#xff0c;帮助读者快速从新手成长…

算法思想总结:哈希表

一、哈希表剖析 1、哈希表底层&#xff1a;通过对C的学习&#xff0c;我们知道STL中哈希表底层是用的链地址法封装的开散列。 2、哈希表作用&#xff1a;存储数据的容器&#xff0c;插入、删除、搜索的时间复杂度都是O&#xff08;1&#xff09;&#xff0c;无序。 3、什么时…

YOLOv10训练教程—用YOLOv10训练自己的数据集

文章目录 YOLOv10简介亮点模型介绍 下载源码环境配置准备数据集训练模型&#xff1a;命令行py文件 验证模型推理参考文献 ✨✨✨✨立志真正解决大家问题&#xff0c;只写精品博客文章&#xff0c;感谢关注&#xff0c;共同进步✨✨✨✨ YOLOv9还没捂热乎&#xff0c;YOLOv10就推…

【传知代码】探索视觉与语言模型的可扩展性(论文复现)

前言&#xff1a;在数字化时代的浪潮中&#xff0c;我们见证了人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其中视觉与语言模型作为两大核心领域&#xff0c;正以前所未有的速度改变着我们的生活和工作方式。从图像识别到自然语言处理&#xff0c;从虚拟现实…

防雷接地测试方法及注意事项

一、防雷接地的测试方法 检测避雷针、高层建筑物等设施的接地电阻&#xff0c;接雷后能否顺畅导入大地。 1、你先找到防雷接地网的接地引线或等电位联接箱。 2、用接地电阻测测试仪测接地电阻。 &#xff08;有两根测试桩0.4M的要插入泥土&#xff0c;一根距测试点20米&…

抽屉式备忘录(共25041字)

Sing Me to Sleep <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>与妖为邻的备忘录</title&g…