【Leetcode】2702. Minimum Operations to Make Numbers Non-positive

题目地址:

https://leetcode.com/problems/minimum-operations-to-make-numbers-non-positive/description/

给定一个长 n n n正整数数组 a a a,再给定两个正整数 x x x y y y并且 x > y x>y x>y。每一次操作允许将某个位置的数减 x x x,并将所有其他数减 y y y。问至少多少次操作可以使得整个数组每个数都非正。

可以二分答案。我们验证 p p p次操作是否能达到目的。我们可以将一次操作理解为,先将所有数都减去 y y y,同时再挑一个数减去 x − y x-y xy。那么 p p p次操作就可以理解为,每个数先减去 p y py py,然后还有 p p p次机会再将一些数减 x − y x-y xy。我们只需要验证哪些数需要额外的机会,并且总的额外的机会个数是否小于等于 p p p即可。代码如下:

class Solution {
 public:
  using ll = long long;
  int minOperations(vector<int>& a, int x, int y) {
    int l = 1, r = 0;
    for (int x : a) r = max(r, x);
    r = (r + y - 1) / y;
    int diff = x - y;
    auto f = [&](int op) {
      ll extra_op = 0;
      for (int z : a) {
        int r = z - y * op;
        // r > 0说明当前数z需要额外机会
        if (r > 0) extra_op += ((ll)r + diff - 1) / diff;
      }
      return extra_op <= op;
    };
    while (l < r) {
      int mid = l + (r - l >> 1);
      if (f(mid))
        r = mid;
      else
        l = mid + 1;
    }
    return l;
  }
};

时间复杂度 O ( n log ⁡ max ⁡ a y ) O(n\log \frac{\max a}{y}) O(nlogymaxa),空间 O ( 1 ) O(1) O(1)

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值