Leetcode2528. 最大化城市的最小电量

2024-02-02 09:20

本文主要是介绍Leetcode2528. 最大化城市的最小电量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Every day a Leetcode

题目来源:2528. 最大化城市的最小电量

解法1:二分查找 + 前缀和 + 差分数组

看到「最大化最小值」或者「最小化最大值」就要想到二分答案,这是一个固定的套路。

为什么?一般来说,二分的值越大,越能/不能满足要求;二分的值越小,越不能/能满足要求,有单调性,可以二分。

二分答案 minPower,从左到右遍历 stations,如果 stations[i] 电量不足 minPower,那么需要建供电站来补足。

在哪建供电站最好呢?

由于 i 左侧的不需要补足,所以贪心地在 min⁡(i+r,n−1) 处建是最合适的,恰好让 i 在覆盖范围的边界上。

设需要建 m 个供电站,那么需要把 [i,min⁡(i+2r,n−1)] 范围内的电量都增加 m。

方法很多,用差分数组来更新是最简单的。

最后判断修建的供电站是否超过 k,如果超过说明 minPower 偏大,否则说明偏小。

代码:

/** @lc app=leetcode.cn id=2528 lang=cpp** [2528] 最大化城市的最小电量*/// @lc code=start
class Solution
{
public:long long maxPower(vector<int> &stations, int r, int k){int n = stations.size();vector<long long> preSum(n + 1, 0);long long diff[n];vector<long long> power(n, 0);// 求前缀和for (int i = 1; i <= n; i++)preSum[i] = preSum[i - 1] + stations[i - 1];// 求电量for (int i = 0; i < n; ++i)power[i] = preSum[min(i + r + 1, n)] - preSum[max(i - r, 0)];auto check = [&](long long min_power) -> bool{memset(diff, 0, sizeof(diff)); // 重置差分数组long long sum_d = 0, need = 0;for (int i = 0; i < n; i++){sum_d += diff[i]; // 累加差分值long long m = min_power - power[i] - sum_d;if (m > 0){ // 需要 m 个供电站need += m;if (need > k)return false; // 提前退出这样快一些sum_d += m;       // 差分更新if (i + r * 2 + 1 < n)diff[i + r * 2 + 1] -= m; // 差分更新}}return true;};// 二分查找,开区间写法long long left = *min_element(power.begin(), power.end());long long right = left + k + 1;while (left + 1 < right){long long mid = left + (right - left) / 2;if (check(mid))left = mid;elseright = mid;}return left;}
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogk),其中 n 为数组 stations 的长度。二分需要循环 O(log⁡k) 次。

空间复杂度:O(n),其中 n 为数组 stations 的长度。

这篇关于Leetcode2528. 最大化城市的最小电量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670243

相关文章

LeetCode--155 最小栈

题目 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。 示例 MinStack minStack = new MinStack();minStack.push(-2);minStack.push

中国341城市生态系统服务价值数据集(2000-2020年)

生态系统服务反映了人类直接或者间接从自然生态系统中获得的各种惠益,对支撑和维持人类生存和福祉起着重要基础作用。目前针对全国城市尺度的生态系统服务价值的长期评估还相对较少。我们在Xie等(2017)的静态生态系统服务当量因子表基础上,选取净初级生产力,降水量,生物迁移阻力,土壤侵蚀度和道路密度五个变量,对生态系统供给服务、调节服务、支持服务和文化服务共4大类和11小类的当量因子进行了时空调整,计算了

Ural 1277 cops ans thieves (最小割模型)

题目地址 :http://acm.timus.ru/problem.aspx?space=1&num=1277 这里我们要拆点。把一个点拆成i,i' 。如何 i,j有边 ,在建边(i,j',inf),(j,i',inf)。 然后每个点点边(i',i,R[i])。这样建边以后,若要阻止 s到f的路径,那么必须破败一些边,那么我们为了是的边权最小,必须破坏边权小于inf的边,对应的就是图中拆

鹅算法(GOOSE Algorithm,GOOSE)求解复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、鹅算法 鹅优化算法(GOOSE Algorithm,GOOSE)从鹅的休息和觅食行为获得灵感,当鹅听到任何奇怪的声音或动作时,它们会发出响亮的声音来唤醒群中的个体,并保证它们的安全。 参考文献 [1]Hamad R K, Rashid T A. GOOSE algorithm: a powerful optimization tool for real-world engineering

高考志愿填报选专业,学校的城市和学习环境分析

高考分数出炉之后,如何填报志愿选专业,根据以往的数据统计,有相当部分的同学,错失了自己喜欢的专业,而不得不接受调剂。有的同学被调剂到冷门专业,有的同学则是被综合实力相对较差的学校录取,所以高考志愿填报是一件需要格外慎重的事,必须打起十二分精神,也需要懂得听取多方意见,权衡利弊的做选择。 那对于高考生而言,在高考志愿填报中,如何对学校地理位置与学校环境进行考量呢? 高中生(填报志愿,选专业),可

动态规划DP--斐波那契数、爬楼梯、使用最小花费爬楼梯等示例代码

动态规划DP 文章目录 动态规划DP509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯62. 不同路径63. 不同路径II343.整数拆分 509. 斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) =

【数学】100332. 包含所有 1 的最小矩形面积 II

本文涉及知识点 数学 LeetCode100332. 包含所有 1 的最小矩形面积 II 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形,并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意,这些矩形可以相接。 示例 1: 输入: grid = [[1,0,1],[1,1,1]]

Day 31:100334. 包含所有1的最小矩形面积Ⅰ

Leetcode 100334. 包含所有1的最小矩形面积Ⅰ 给你一个二维 **二进制 **数组 grid。请你找出一个边在水平方向和竖直方向上、面积 最小 的矩形,并且满足 grid 中所有的 1 都在矩形的内部。 返回这个矩形可能的 **最小 **面积。 确定首次出现 1 的第一行 top,最后一次出现 1 的最后一列 r,最后一次出现 1 的最后一行 bottom,首次出现的第

二级联动菜单--常见的城市二级联动

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> 二级联动菜单 </TITLE><script language="javascript">var jiangxi=[["1","南昌"],["2","上饶"],["3","赣州"]];var zhejiang=[["1","

基于ACO蚁群优化的城市最佳出行路径规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述       基于ACO蚁群优化的城市最佳出行路径规划matlab仿真,可以修改城市个数,输出路径规划结果和ACO收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 点数较少时 点数规模中等时 点数较多时