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

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

  • 二分答案 + 前缀和 + 差分 + 贪心

    • 用前缀和把每个点的电量求出
    • 二分答案
    • 遍历数组,若电量不够则在i+r处放发电站,即在[i,i+2*r]区间内+1
  •   class Solution {
      public:
          long long maxPower(vector<int>& stations, int r, int k) {
              int n = stations.size();
              long sum[n+1],power[n],dif[n];
              sum[0] = 0;
              for(int i=0;i<n;i++)
                  //前缀和
                  sum[i+1] = sum[i] + stations[i];
              for(int i=0;i<n;i++)
                  power[i] = sum[min(i+r+1,n)] - sum[max(i-r,0)];
              
              auto check = [&](long min_power) -> bool{
                  //重置差分数组
                  memset(dif,0,sizeof(dif));
                  long sum_d = 0,need = 0;
                  for(int i=0;i<n;i++)
                  {
                      //累积差分和,其意义为当前位置新增的电量
                      sum_d += dif[i];
                      //需要建几个电站
                      long m = min_power - power[i] - sum_d;
                      if(m > 0)
                      {
                          need += m;
                          if(need > k) return false;
                          //新增m电量
                          sum_d += m;
                          //[i,i+2r]区间+1
                          if(i + 2*r +1 < n) dif[i+2*r+1] -= m; 
                      }
                  }
                  return true;
              };
              long left = *min_element(power, power + n), right = left + k; // 开区间写法
              while (left < right) {
                  long mid = (left + right + 1)/ 2;
                  check(mid) ? left = mid: right = mid - 1;
              }
              return left;
          }
      };
    
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光男孩01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值