2 条题解

  • 0
    @ 2025-11-27 18:49:05
    • 更好理解的写法
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {	
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        
        int T, n, l, r;
        cin >> T;
        while (T--) {
            cin >> n >> l >> r;
            vector<int> a(n);
            for (int i = 0; i < n; i++) cin >> a[i];
            
            
            int ans = 0, sum = 0;
            for (int i = 0, j = 0; i < n; i++) {
                
                // 当 sum < l 并且还可以往右移
                sum += a[i];
                while (sum < l && i + 1 < n) sum += a[++i];
                
                // 情况一: l <= sum <= r 直接得分, i 和 j 都移到后一个位置
                if (l <= sum && sum <= r) sum = 0, ans++, j = i + 1;
                else {
                    // 情况二:sum >= r, 需要从左开始删除一些数
                    while (sum > r && j <= i) sum -= a[j++];
                    if (sum >= l) sum = 0, ans++, j = i + 1;
                    else {
                        // 情况三:不能删除一些数使得 sum >= l
                        // 其实啥也不干, 继续游戏就好
    //                    sum = 0, j = i + 1;
                    }
                }
            }
            cout << ans << '\n';
        }
        
        return 0;
    }
    
    • 0
      @ 2025-11-19 21:04:40
      • 同向双指针
      #include <bits/stdc++.h>
      using namespace std;
      
      int solve(const vector<int>& a, int l, int r) {
          int n = a.size(), ans = 0, sum = 0, j = 0;
          for (int i = 0; i < n; i++) {
              // 先往右扩展, 直到 sum >= l
              sum += a[i];
              while (sum < l && i + 1 < n) sum += a[++i];
      
              // sum > r 时, 从左边开始删除一些数
              while (sum > r && j <= i) sum -= a[j++];
              if (sum >= l && sum <= r) ans++, sum = 0, j = i + 1;
          }
          return ans;
      }
      
      int main() {	
          ios::sync_with_stdio(false);
          cin.tie(0); cout.tie(0);
          
          int T, n, l, r;
          cin >> T;
          while (T--) {
              cin >> n >> l >> r;
              vector<int> a(n);
              for (int i = 0; i < n; i++) cin >> a[i];
              cout << solve(a, l, r) << '\n';
          }
      
          return 0;
      }
      
      /*
      1
      3 4 5
      3 3 1
      
      1
      */
      
      /*
      1
      3 4 5
      3 3 4
      
      1
      */
      
      • 1

      信息

      ID
      188
      时间
      100ms
      内存
      32MiB
      难度
      6
      标签
      递交数
      60
      已通过
      19
      上传者