2025.11.07 力扣每日一题

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

cpp 复制代码
//解决"最大化最小供电量" 问题 核心思路是二分查找 + 贪心策略 + 差分数组
//目标是让所有城市的供电量中最小的那个值尽可能大。
class Solution {
public:
    long long maxPower(vector<int>& stations, int r, int k) {
        //计算初始供电量(差分数组 cnt)
        int n = stations.size();
        vector<long long> cnt(n + 1);// 差分数组,大小n+1避免越界
        for (int i = 0; i < n; i++) {
            int left = max(0, i - r);// 第i座城市的供电站覆盖的左边界
            int right = min(n, i + r + 1);// 覆盖的右边界(差分数组的右边界是开区间)
            cnt[left] += stations[i];// 左边界加供电站数量
            cnt[right] -= stations[i];// 右边界减供电站数量
        }
//check 函数(验证目标值是否可达)
        auto check = [&](long long val) -> bool {
            vector<long long> diff = cnt;// 复制差分数组(避免修改原数组) 
            long long sum = 0;// 当前城市的实际供电量(前缀和)
            long long remaining = k;// 剩余可建造的电站数量
            
            for (int i = 0; i < n; i++) {
                sum += diff[i];
                if (sum < val) {// 若当前供电量不足,需要补建电站
                    long long add = val - sum;//需要补建的数量
                    if (remaining < add) {// 剩余电站不够,目标不可达
                        return false;
                    }
                    remaining -= add;// 消耗剩余电站
 // 补建的电站应放在尽可能靠右的位置(覆盖范围最大)
                    int end = min(n, i + 2 * r + 1);// 补建电站的覆盖右边界
                    diff[end] -= add;// 差分数组标记:从i到end-1增加add
                    sum += add;// 当前城市的供电量更新为val
                }
            }
            return true;// 所有城市都满足≥val,目标可达
        };
//二分查找框架
        long long lo = ranges::min(stations);// 下界:初始最小供电站数量(保守估计)
        long long hi = accumulate(stations.begin(), stations.end(), 0LL) + k;// 上界:总电站+额外k座
        long long res = 0;
        while (lo <= hi) {
            long long mid = lo + (hi - lo) / 2;// 中间值(当前猜测的最小供电量)
            if (check(mid)) {// 若能实现所有城市供电量≥mid
                res = mid;// 更新答案
                lo = mid + 1;// 尝试更大的目标
            } else {
                hi = mid - 1;// 目标太大,尝试更小的
            }
        }
        return res;
    }
};
相关推荐
骑着蜗牛撵大象32715 小时前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练
Eyfcom15 小时前
〖阶段性回顾〗物流系统架构与算法的 Day 1-5 知识图谱与实战答疑
算法·系统架构·知识图谱·物流管理系统·快递管理系统
xunberg15 小时前
【Agent 生产化手记-02】Agent 怎么向人提问
人工智能·算法·架构
海绵宝宝转agent15 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
Rain的Java大神之路15 小时前
面试被LeetCode 27(移除元素)问懵?别再用两层 for 循环了:一道“简单题”吃透双指针原地删除,附面试加分话术 + 11 个避坑清单
后端·leetcode·面试
pjj1985416 小时前
YOLO 目标检测算法系列梳理:从 V1 到 V5 的原理演进
算法·yolo·目标检测
二十七日秋16 小时前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
晚风叙码16 小时前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法
silvamux_17 小时前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
重生之小比特17 小时前
【算法拾光】前缀和|连续的子数组和 + 和相同的二元子数组
算法·leetcode·哈希算法