当前位置: 首页 > news >正文

蓝桥杯算法题:区间移位

题目描述

数轴上有n个闭区间:D1,...,Dn。
其中区间Di用一对整数[ai, bi]来描述,满足ai < bi。
已知这些区间的长度之和至少有10000。
所以,通过适当的移动这些区间,你总可以使得他们的“并”覆盖[0, 10000]——也就是说[0, 10000]这个区间内的每一个点都落于至少一个区间内。
你希望找一个移动方法,使得位移差最大的那个区间的位移量最小。


具体来说,假设你将Di移动到[ai+ci, bi+ci]这个位置。你希望使得maxi{|ci|} 最小。

输入

输入的第一行包含一个整数n,表示区间的数量。
接下来有n行,每行2个整数ai, bi,以一个空格分开,表示区间[ai, bi]。
保证区间的长度之和至少是10000。

输出

输出一个数字,表示答案。如果答案是整数,只输出整数部分。如果答案不是整数,输出时四舍五入保留一位小数。

样例输入

2
10 5010
4980 9980
样例输出 

20

首先说思路,在满足条件的所有值中取最大值,常见的二分问题,而又涉及到区间遍历,可能会有考贪心。这道题,大致看起来,可以按一般贪心的思路,将全部区间按右端点值由小到大排序,然后采用二分,判断mid值是否可以让所有区间通过移位达到连续不断,并且长度大于10000。

①二分:这道题看数据会出现小数,其实最小也就0.5,我看别人的做法是把有关区间以及距离什么的都乘2,这样算出来的mid最小值也就为1,可以用整数二分。但我直接用的实数二分,也是差不多的,可能算的次数会多一点。

②check函数:每次二分,都要判断mid是否满足条件,就要用到check函数。其实我的想法是遍历区间,拿遍历到的某个区间[l,r]跟之前遍历完所有区间形成的右端最大值mr比较,如果l-mid>mr,那说明我往左移也跟前面所有区间形成不了交集,那当然后边的区间也一样,所以直接判断mid不符合要求(当时是这样想的,不过细想其实有错),然后就这样遍历完,如果mr≥10000,不就说明mid可以实现区间移位连续嘛,那就继续二分,直到二分的区间缩成一个值。

但是,最后程序无论怎么改,都只过了九个测试点,挠头

(过九个测试点): 

#include<bits/stdc++.h>
using namespace std;
struct Point{int l,r;Point(int a,int b){l=a,r=b;}friend bool operator<(const Point& p1,const Point& p2){if(p1.r!=p2.r)return p1.r<p2.r;//为什么要优先用r排序?贪心思想, else return p1.l<p2.l;}
};
vector<Point>pv;
bool check(double mid){cout<<mid<<endl;vector<Point>temp(pv);//复制vector来进行模拟double mr=0;//表示所有区间通过不同移动能将右端点扩大到的范围 for(int i=0;i<temp.size();i++){int l=temp[i].l,r=temp[i].r;if(mr+1e-6>l-mid&&mr<r+mid+1e-6){//mr>=l-mid说明可以通过对区间[l,r]进行左移操作实现与原来的区间有交,也就是使整个区间连续,mr<=r+mid是指通过这个区间[l,r]右移,可以实现mr变大,不然处理[l,r]区间又有什么意义呢 if(mr<l){mr=r-l+mr;}else{if(l+mid>mr)mr+=(r-l);else mr+=(r-l-(mr-l-mid));}}if(mr<l-mid)return false;} return mr+1e-6>10000;//循环正常结束也不一定能行,要区间右端最大值大于等于10^4 
}
int main(){//这道题,典型的大于中找最小,大于是指mid超过某一个值,就可以实现所有区间移动覆盖整个范围,最小是指要找的mid要满足条件且最小,直接套模板 int n;cin>>n;int l,r;for(int i=0;i<n;i++){cin>>l>>r;pv.push_back(Point(l,r));}sort(pv.begin(),pv.end()); 
double L=0,R=10000,mid;while(R-L>1e-6){cout<<mid<<" "<<L<<" "<<R<<endl;mid=(L+R)/2;//维护左边if(check(mid)){R=mid;}else{L=mid;}}if(mid>1e-6)cout<<mid<<endl;else cout<<0<<endl;
}

好吧,现在讲讲AC的代码,我当时看别人的题解也好奇,为什么一次遍历的事,他还要加个while循环,这不增加工作量嘛,我绞尽脑汁也想不明白while有什么用处,后边才发现,原来是弥补贪心策略的不足!!!我先举个例子:

对于数据 :

3

1000 2000

800 3000

2200 10000

考虑贪心,区间按右端点值从小到大排吗?这样输出的答案可不对哦,输出的答案会是1000,正确的答案可是800!!!

那要不考虑区间按左端点从大到小排?

对于数据:

3

2 1000

3 8

1002 1000 

按左排输出的答案可就是994了喔!!!所以,我自己也不知道到底要怎样贪心了

可能ac的人也不知道吧,所以他们添了一层循环,为的是保证一个之前没用到的区间,以后还有机会用,这样就加大了正确的可能,毕竟,谁也不知道哪个区间先用上嘛,不同区间用的先后次序不同,可能产生不同结果。

自我安慰:这道题主要考二分,其他不懂的是次要的(好吧,还是自己贪心不行)

所以,要是有更好的策略,可以跟我分享,救救菜狗

(叠甲,这篇博客是在精神不正常状态下写的,语无伦次,看题解可以去那些大佬博客)

 (AC):

#include<bits/stdc++.h>
using namespace std;
struct Point{int l,r;Point(int a,int b){l=a,r=b;}friend bool operator<(const Point& p1,const Point& p2){if(p1.r!=p2.r)return p1.r<p2.r;//为什么要优先用r排序?贪心思想, else return p1.l<p2.l;}
};
vector<Point>pv;
bool check(double mid){vector<Point>temp(pv);//复制vector来进行模拟double mr=0;//表示所有区间通过不同移动能将右端点扩大到的范围 while(true){//避免一些特殊区间影响,弥补贪心的不足bool flag=false;for(int i=0;i<temp.size();i++){int l=temp[i].l,r=temp[i].r;if(mr+1e-6>l-mid&&mr<r+mid+1e-6){//mr>=l-mid说明可以通过对区间[l,r]进行左移操作实现与原来的区间有交,也就是使整个区间连续,mr<=r+mid是指通过这个区间[l,r]右移,可以实现mr变大,不然处理[l,r]区间又有什么意义呢 flag=true;if(mr<l){mr=r-l+mr;}else{if(l+mid>mr)mr+=(r-l);else mr+=(r-l-(mr-l-mid));}temp.erase(temp.begin()+i);break;}} if(!flag||mr+1e-6>10000)break;} return mr+1e-6>10000;//循环正常结束也不一定能行,要区间右端最大值大于等于10^4 
}
int main(){//这道题,典型的大于中找最小,大于是指mid超过某一个值,就可以实现所有区间移动覆盖整个范围,最小是指要找的mid要满足条件且最小,直接套模板 int n;cin>>n;int l,r;for(int i=0;i<n;i++){cin>>l>>r;pv.push_back(Point(l,r));}sort(pv.begin(),pv.end()); 
double L=0,R=10000,mid;while(R-L>1e-6){mid=(L+R)/2;//维护左边if(check(mid)){R=mid;}else{L=mid;}}if(mid>1e-6)cout<<mid<<endl;else cout<<0<<endl;
}

相关文章:

蓝桥杯算法题:区间移位

题目描述 数轴上有n个闭区间&#xff1a;D1,...,Dn。 其中区间Di用一对整数[ai, bi]来描述&#xff0c;满足ai < bi。 已知这些区间的长度之和至少有10000。 所以&#xff0c;通过适当的移动这些区间&#xff0c;你总可以使得他们的“并”覆盖[0, 10000]——也就是说[0, 100…...

提取word文档里面的图片

大家好&#xff0c;我是阿赵。   阿赵我写博客的时候的习惯是&#xff0c;先用word文档写好&#xff0c;然后再把word文档里面的图片另存&#xff0c;最后再在博客里面复制正文和上传图片。   而我写的文章一般配图都比较多&#xff0c;所以经常要做的一个功能就是另存图片…...

MybatisPlus总结

一、MyBatis回顾 &#xff08;1&#xff09;什么是MyBatis&#xff1a;MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映…...

使用 mitmproxy 抓包 grpc

昨天在本地执行 grpc 的 quick start&#xff08;python版本的&#xff09;&#xff0c;我了解 grpc 内部使用的是 HTTP2&#xff0c;所以我就想着抓包来试试&#xff0c;下面就来记录一下这个过程中的探索。 注意&#xff1a;我的电脑上面安装了 Fiddler Classic&#xff0c;…...

【解决Jetson Nano 内存不足问题】纯命令行将 Conda 环境迁移到 SD 卡

前言 Jetson Nano 板载只有 16GB 的存储空间&#xff0c;在安装完 Ubuntu 和 Conda 环境后&#xff0c;剩余空间就捉襟见肘了&#xff0c;无法满足安装 PyTorch 等大型包的需求。此时如果你有一张SD卡&#xff0c;那么可以考虑将 Conda 环境迁移到 SD 卡上。 但网上的教程基本…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

顺序表的应用

文章目录 目录1. 基于动态顺序表实现通讯录项目2.顺序表经典算法2.1 [移除元素](https://leetcode.cn/problems/remove-element/description/)2.2 [合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/) 3. 顺序表的问题及思考 目录 基于动态顺序…...

2024-04-03-代码随想录算法训练营第一天[LeetCode704二分查找、LeetCode27移除元素]

文章目录 第一题解法一[左闭右开]解法二[左闭右闭]总结 第二题解法一[暴力解法]解法二[双指针法]总结 第一题 LeetCode704二分查找 解法一[左闭右开] class Solution { public:int search(vector<int>& nums, int target) {int size nums.size();int right size…...

[Go运行问题]/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_xx‘ not found

问题描述 在一台ubuntu 20的机器上通过go 编译生成的可执行程序(使用了cgo)&#xff0c;在其他ubuntu机器上运行时出现如下问题 /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 问题分析 因为go代码里的依赖库使用到了sndfile&#xff0c;它必须使用cgo了…...

matrix-breakout-2-morpheus 靶机渗透

信息收集&#xff1a; 1.nmap存活探测&#xff1a; nmap -sn -r 192.168.10.1/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-06 12:13 CST Nmap scan report for 192.168.10.1 Host is up (0.00056s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap…...

爬虫 新闻网站 以湖南法治报为例(含详细注释) V1.0

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…...

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…...

[Java]网络编程

网络编程概述 计算机网络&#xff1a; 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序…...

重读Java设计模式: 适配器模式解析

引言 在软件开发中&#xff0c;经常会遇到不同接口之间的兼容性问题。当需要使用一个已有的类&#xff0c;但其接口与我们所需的不兼容时&#xff0c;我们可以通过适配器模式来解决这一问题。适配器模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。本…...

MySQL面试题系列-9

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…...

书生·浦语训练营二期第二次笔记

文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战&#xff1a;部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件&#xff1a;2.3 下载运行 Chat-八戒 Demo 3. …...

python_3

文章目录 题目运行结果模式A模式B模式C模式D 题目 mode input("请选择模式:") n int(input("请输入数字:"))if mode "A" or mode "a":# 模式A n:输入的层数 i:当前的层数# 每行数字循环次数 ifor i in range(1, n 1):for j in r…...

【Python】 使用Apache Tika和Python实现zip、csv、xls等多格式文件文本内容提取

时间的电影 结局才知道 原来大人已没有童谣 最后的叮咛 最后的拥抱 我们红着眼笑 我们都要把自己照顾好 好到遗憾无法打扰 好好的生活 好好的变老 好好假装我 已经把你忘掉 &#x1f3b5; 五月天《好好》 在进行数据分析、搜索引擎优化或任何需要处理大量…...

C语言如何将多维数组名作为函数参数?

一、问题 ⼦函数执⾏时&#xff0c;整个多维数组是由主函数决定的&#xff0c;这时就要把多维数组的数组名作为函数参数传递给⼦函数。那么在C程序中&#xff0c;怎样将多维数组名作函数参数进⾏传递&#xff1f; 二、解答 以⼆维数组为例&#xff0c;其格式如下。 形参定义&…...

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...

分布式光纤声振传感技术原理与瑞利散射机制解析

分布式光纤传感技术&#xff08;Distributed Fiber Optic Sensing&#xff0c;简称DFOS&#xff09;作为近年来迅速发展的新型感知手段&#xff0c;已广泛应用于边界安防、油气管道监测、结构健康诊断、地震探测等领域。其子类技术——分布式光纤声振传感&#xff08;Distribut…...