4 条题解

  • 18
    @ 2024-4-5 20:41:48

    话不多说,直接上代码:

    #include <bits/stdc++.h>
    using namespace std;
    int k[1000010],dp[100010];
    int n,ans,a,b;
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a>>b;
            k[a]=b;
        }
        for(int i=0;i<=1000000;i++)
        {
            if(k[i]){
                int j=i-k[i]-1;
                if(j>=0){
                    dp[i]=dp[j]+1;
                }
                else
                {
                    dp[i]=1;
                }
            }
            else{
                dp[i]=dp[i-1];
            }
            ans=max(ans,dp[i]);
        }
        cout<<n-ans;
        return 0;
    }
    

    打码不易,点个赞吧!

    100 Accepted

    # 状态分数 耗时 内存占用
    --------------------------------------
    #1 Accepted10 36ms 7.4 MiB
    -
    #2 Accepted10 31ms 7.6 MiB
    #3 33ms 6.9 MiB
    #4 28ms
    #5 25ms
    #6 17ms 7.6 MiB
    #7 15ms 7 MiB
    #8 10ms 7.8 MiB
    #9 5ms 7.5 MiB
    #10 2ms
    • 3
      @ 2023-7-6 16:37:37

      f[i]表示从i开始从右往左激活激光塔,最终摧毁的激光塔数量。初始状态f[0]=0。可以使用二分找到没有激活i之后,被摧毁的最左边的激光塔p,那么状态可以转移为f[p - 1] + i - p(其中i-p是被i摧毁的激光塔数量)。枚举添加新激光塔后,没有被摧毁的最右边的激光塔i,则被摧毁的激光塔数量为f[i] + n - i,取最小值即为答案。

      核心代码
      
      sort(t + 1, t + n + 1);
      for (int i = 1; i <= n; i++) {
      	int p = lower_bound(t + 1, t + i, (T){t[i].a - t[i].b, 0}) - t;
      	f[i] = f[p - 1] + i - p;
      }
      int ans = 1e9;
      for (int i = 1; i <= n; i++)
      	ans = min(ans, f[i] + n - i);
      cout << ans << endl;
      
      结构体定义
      
      struct T {
          int a, b;
          bool operator < (const T& x) const {
              if (a == x.a)
                  return b < x.b;
              return a < x.a;
          }
      } t[MAXN];
      
      • -7
        @ 2024-4-6 10:48:17

        😄

        #include <bits/stdc++.h> using namespace std; int k[1000010], dp[1000010]; int n, a, b, ans; int main() { cin >> n; for (int i = 0; i <n ; i ++) { cin >> a >> b; k[a] = b; } for (int i = 0; i <= 1000000; i ++) { if (k[i] > 0) { int pre = i - k[i] - 1; if (pre >= 0) { dp[i] = dp[pre] + 1; } else dp[i] = 1; } else { dp[i] = dp[i - 1]; } ans = max(ans, dp[i]); } cout << n - ans; }

        • -8
          @ 2024-4-9 20:16:28

          #include <bits/stdc++.h> using namespace std; int k[1000010],dp[100010]; int n,ans,a,b; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a>>b; k[a]=b; } for(int i=0;i<=1000000;i++) { if(k[i]){ int j=i-k[i]-1; if(j>=0){ dp[i]=dp[j]+1; } else { dp[i]=1; } } else{ dp[i]=dp[i-1]; } ans=max(ans,dp[i]); } cout<<n-ans; return 0; }

          • 1

          信息

          ID
          267
          时间
          1000ms
          内存
          256MiB
          难度
          3
          标签
          (无)
          递交数
          576
          已通过
          327
          上传者