【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐

【动态规划】【广度优先】LeetCode2258:逃离火灾

本文涉及的基础知识点

二分查找算法合集
滑动窗口

题目

给你一个下标从 0 开始长度为 n 的整数数组 stations ,其中 stations[i] 表示第 i 座城市的供电站数目。
每个供电站可以在一定 范围 内给所有城市提供电力。换句话说,如果给定的范围是 r ,在城市 i 处的供电站可以给所有满足 |i - j| <= r 且 0 <= i, j <= n - 1 的城市 j 供电。
|x| 表示 x 的 绝对值 。比方说,|7 - 5| = 2 ,|3 - 10| = 7 。
一座城市的 电量 是所有能给它供电的供电站数目。
政府批准了可以额外建造 k 座供电站,你需要决定这些供电站分别应该建在哪里,这些供电站与已经存在的供电站有相同的供电范围。
给你两个整数 r 和 k ,如果以最优策略建造额外的发电站,返回所有城市中,最小电量的最大值是多少。
这 k 座供电站可以建在多个城市。
示例 1:
输入:stations = [1,2,4,5,0], r = 1, k = 2
输出:5
解释:
最优方案之一是把 2 座供电站都建在城市 1 。
每座城市的供电站数目分别为 [1,4,4,5,0] 。

  • 城市 0 的供电站数目为 1 + 4 = 5 。
  • 城市 1 的供电站数目为 1 + 4 + 4 = 9 。
  • 城市 2 的供电站数目为 4 + 4 + 5 = 13 。
  • 城市 3 的供电站数目为 5 + 4 = 9 。
  • 城市 4 的供电站数目为 5 + 0 = 5 。
    供电站数目最少是 5 。
    无法得到更优解,所以我们返回 5 。
    示例 2:
    输入:stations = [4,4,4,4], r = 0, k = 3
    输出:4
    解释:
    无论如何安排,总有一座城市的供电站数目是 4 ,所以最优解是 4 。
    参数范围
    n == stations.length
    1 <= n <= 105
    0 <= stations[i] <= 105
    0 <= r <= n - 1
    0 <= k <= 109

分析

时间复杂度😮(logmn),其中m是可能的最大的最小电量std::accumulate(stations.begin(), stations.end(),0LL) + k

二分查找

判断所有城市的电量能否达到mid,mid为0的时候一定可以,随着mid增加变得不可能。求最后一个可能的mid,显然左闭右开的二分。

Can函数

llSum记录当前城市的最大电量
k还可以建造的电站数量
stations记录各城市的电站数,包括新建的

如果当前城市电量不够,则建设电站到本城市电量更好满足要求。如果无法建造则失败。选择能给本城市供电的城市中最右的城市建造电站。

代码

核心代码

class Solution {
public:long long maxPower(vector<int>& stations, int r, int k) {m_c = stations.size();long left = 0, right = std::accumulate(stations.begin(), stations.end(),0LL) + k  + 1;while (right - left > 1){const auto mid = left + (right - left) / 2;if (Can(stations, mid, r, k)){left = mid;}else{right = mid;}}return left;}bool Can(vector<int> stations, const long long llMin, const int r,int k){long long llSum = 0;for (int i = 0; i < r; i++){//stations[r]下面循环加llSum += stations[i];}for (int i = 0; i < stations.size(); i++){const int iDel = i - r - 1;if (iDel >= 0){llSum -= stations[iDel];}const int iAdd = i + r;if (iAdd < m_c){llSum += stations[iAdd];}if (llSum < llMin){const long long llNeed = llMin - llSum;if (k < llNeed){return false;}k-= llNeed;llSum = llMin;stations[min(iAdd, m_c - 1)] += llNeed;}}return true;}int m_c;
};

测试用例

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){assert(v1[i] == v2[i]);}
}template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}int main()
{vector<int> stations;int r, k;{Solution slu;stations = { 1, 2, 4, 5, 0 };r = 1, k = 2;auto res = slu.maxPower(stations, r, k);Assert(5LL, res);}{Solution slu;stations = { 4,4,4,4 };r = 0, k = 3;auto res = slu.maxPower(stations, r, k);Assert(4LL, res);}//CConsole::Out(res);
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业

。也就是我们常说的专业的人做专业的事。 |
|如果程序是一条龙,那算法就是他的是睛|

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Java学习总结

1. Java集合体系框架 java.util中包含 Java 最常用的the collections framework。 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection 接口派生出了三个子接口List、Set、Queue。Map 接口 因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。 …

CDH6.3.2安装

文章目录 [toc]一、CM简介1、ClouderaManager的概念2、ClouderaManager的功能3、ClouderaManager的架构 二、准备清单1、部署步骤2、集群规划3、软件环境准备 三、安装清单1、操作系统iso包2、JDK包3、MySQL包4、CM和CDH包5、部署ansible 四、基础环境准备1、配置网络2、配置ho…

Java项目开发,业务比较复杂如何减少bug

Java项目开发&#xff0c;业务比较复杂如何减少bug 当Java开发工作涉及复杂业务时&#xff0c;可以采取以下方法来减少bug的数量&#xff1a; 1、深入了解业务需求 充分了解业务需求&#xff0c;与业务人员进行充分的沟通和交流&#xff0c;确保对需求的理解正确。在需求分析…

el-collapse 默认展开第一个(实测有效)

<el-collapse accordion v-model"activeCollapse"> <el-collapse-item v-for"(item, index) in assetList" :name"index" :key"item.id" > 我这个是通过循环, 只需要v-model 绑定的值和 name 相等,就可以实现展开 然后就…

重新认识Word——给图、表、公式等自动编号

重新认识Word——给图、表、公式等自动编号 给图增加题注题注失败的情况给图添加“如图xx-xx所示” 给公式插入题注第一步——先加题注第二步——设置两个制表符 解决题注“图一-1”的问题 前面我们已经学习了如何引用多级列表自动编号了&#xff0c;现在我们有第二个问题&…

大数据湖体系规划与建设方案:PPT全文51页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据数仓建设方案&#xff0c;大数据湖建设规划&#xff0c;大数据湖发展趋势 一、大数据湖体系规划与建设背景 在传统的企业信息化建设中&#xff0c;各个业务系统通常是独立建设的&#xff0c;导致…

学习笔记10——Mysql的DDL语句

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/197161.html 数据库创建&#xff1a; CREATE DATABASE books&#xff1b; CREATE DATABASE IF NOT EXISTS books;更改字符集 ALTER DATABASE books CHARACTER SET gbk;库的删…

FFmpeg之AVFilterLink

这个结构体主要是用来link两个filter的,它存在于每个AVFilterContext中 struct AVFilterContext {const AVClass *av_class; ///< needed for av_log() and filters common optionsconst AVFilter *filter; ///< the AVFilter of which this is an inst…

XX.push is not a function

错误通常发生在尝试在非数组类型的变量上使用push方法 问题&#xff1a;定义了数组类型&#xff0c;用push方法一直报错&#xff0c;感觉哪里都没毛病 原因&#xff1a;虽然刚开始定义了数组类型&#xff0c;但可能是因为在代码的某个地方将其重新赋值为了非数组类型的值。 …

【计算机网络基础2】IP地址和子网掩码

1、IP地址 网络地址 IP地址由网络号&#xff08;包括子网号&#xff09;和主机号组成&#xff0c;网络地址的主机号为全0&#xff0c;网络地址代表着整个网络。 广播地址 广播地址通常称为直接广播地址&#xff0c;是为了区分受限广播地址。 广播地址与网络地址的主机号正…

Mybatis-Plus基础之框架基础

文章目录 Mybatis-Plus 框架基础引入 maven 依赖定义实体类&#xff0c;并标注注解定义 Mapper 接口&#xff0c;要求继承自特定父接口使用 MapperScan 注解&#xff0c;扫描 mapper 接口所在位置验证 Mybatis-Plus 框架基础 MyBatis-Plus 是 MyBatis 的一种增强框架&#xff…

C语言常用字符串

目录 1.什么是字符串 2.如何定义字符串 第3和第4定义的区别&#xff1a;3是字符串变量&#xff0c;4是字符串常量&#xff0c;不予许被修改 3.strlen和sizeof的区别 4.地址分配&#xff08;malloc,realloc,free,memset&#xff09; 案例 5.字符串拷贝(strcpy,strncpy) …

kafka创建新topic

创建topic bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic mytopic bin/kafka-topics.sh //bin目录下的.sh --create --bootstrap-server //固定写法 localhost:9092 //ip端口 --replication-fac…

vue 集成行政区域选择插件region和数据回显

故事&#xff1a;最近&#xff0c;项目需要进行行政区域围栏的绘制&#xff0c;由于老旧项目是利用js保存全国行政区域地址和编码&#xff0c;在选择器select进行匹配显示&#xff0c;但此方法复杂&#xff0c;因此选择集成区域插件region 步骤一&#xff1a;用命令安装region…

JS实现返利网注册系统(网页数据验证)

主代码 <!DOCTYPE HTMLPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><title>返利网注册</tit…

品牌线下店铺的查价方式

不同于电商平台&#xff0c;线下店铺会更传统&#xff0c;产品定价除了受品牌规则的约束&#xff0c;同样也与门店实际销量和促销有关&#xff0c;当遇到地方活动&#xff0c;促销力度大了&#xff0c;价格难免会与品牌要求相差异&#xff0c;但是管控渠道&#xff0c;包含线上…

无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

这个错误表明系统无法找到mvn命令。这通常是因为Maven没有正确安装或者Maven的安装路径没有添加到系统的环境变量中。你需要确保Maven已经正确安装&#xff0c;并且将Maven的安装路径添加到系统的环境变量中。 你可以按照以下步骤在Windows上安装Maven&#xff1a; 1. 访问Mave…

痤疮分割 实验心路历程

数据集的制作 将labelme生成的标注文件记普通的json文件转成coco数据集格式的json文件 图像分辨率过大 如果不做任何调整&#xff1a; 会出现“killed”的报错&#xff0c;表示图片像素过大&#xff0c;显卡内存不够&#xff0c;无法支撑训练 显卡 换成更高性能的显卡&am…

小红书运营方式,需要搭建自己的选题库

无论是个人还是专业号&#xff0c;面临最大的问题是持续创作的能力。如何能够持续发文&#xff0c;同时还能围绕自己的业务输出内容。很多账号断更就是不知道该更新什么&#xff0c;久而久之账号断更。 一般来说这种情况&#xff0c;就需要建立自己的选题库&#xff0c;通过系…

FPGA高端项目:UltraScale GTH + SDI 视频解码,SDI转DP输出,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、详细设计方案设计框图3G-SDI摄像头LMH0384均衡EQUltraScale GTH 的SDI模式应用UltraScale GTH 基本结构参考时钟的选择和分配UltraScale GTH 发送和接收处理流程UltraScale…