2 条题解

  • 2
    @ 2021-9-1 12:08:27

    跳房子比跳石头更复杂一些。找每个g是不是合适需要动态规划。开始写的时候一直不能全对,因为有些石头,哦房子,就是跳不到的不能认为后面的🏠也跳不到。

    #include <bits/stdc++.h>
    #define INF 9223372036854775807
    using namespace std;
    static int pos[500005], val[500005];
    static long long b[500005], current_max;
    int n, k, d;
    bool got_k(int g) {
        int longest = d + g, shortest = max(1, d - g);
        register int left = 0, right = 0;
        current_max = 0;
        for (register int i = 1; i <= n; i++) {
            while (pos[i] - pos[right + 1] >= shortest) {
                current_max = max(current_max, b[++right]);
            }
            while (pos[i] - pos[left] > longest) {
                left++;
                if (left == i) return false;
                if (b[left - 1] == current_max) {
                    current_max = *max_element(b + left, b + right + 1);
                }
            }
            if ((left == right and pos[i] - pos[right] < shortest)
                    or current_max < -5e10 or left > right) {
                b[i] = -INF;
                continue;
            }
            b[i] = current_max + val[i];
            if (b[i] >= k) return true;
        }
        return false;
    }
    int main() {
        scanf("%d %d %d\n", &n, &d, &k);
        pos[0] = 0; val[0] = 0; b[0] = 0;
        for (register int i = 1; i <= n; i++) scanf("%d %d\n", pos + i, val + i);
        int left = 0, right = pos[n] - d, res = 2e9;
        while (left < right) {
            int mid = (left + right) / 2;
            if (got_k(mid)) {
                res = min(res, mid);
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        cout << (res == 2e9 ? -1 : res);
        return 0;
    }
    
    • -2
      @ 2023-2-11 21:31:30

      写题解请注意

      鼓励大家写题解,但注意题解格式。

      题解一定要有思路解析或代码注释,能否让别人理解你的思路

      也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

      给代码两端加上这个会舒服一些

      ```cpp

      你的代码

      ```

      这个点在键盘的左上角tab上面那个键,注意切换输入法

      #include<iostream>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;//这是一个注释
          return 0;
      }
      

      请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

      抄袭题解一经发现直接取消成绩。

      题解被删除的可能

      1. 代码不符合格式规范
      2. 没有思路讲解或者没有注释,
      3. 无意义的题解

      大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • 1

      信息

      ID
      988
      时间
      2000ms
      内存
      256MiB
      难度
      4
      标签
      递交数
      35
      已通过
      17
      上传者