#BW224. 普及组CSP-J初赛程序阅读训练07

普及组CSP-J初赛程序阅读训练07

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int longestSubarray(vector<int>& a, int S) {
    int n = a.size();
    int left = 0, sum = 0, ans = 0;
    for (int right = 0; right < n; right++) {
        sum += a[right];
        while (sum > S && left <= right) {
            sum -= a[left];
            left++;
        }
        ans = max(ans, right - left + 1);
    }
    return ans;
}

int main() {
    int n, S;
    cin >> n >> S;
    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    cout << longestSubarray(a, S) << endl;
    return 0;
}

约定1n1061 \le n \le 10^60S1090 \le S \le 10^90ai1090 \le a_i \le 10^9


第 1 题

若输入为:

6 5
1 2 3 1 2 1

则程序输出为( )
{{ select(1) }}

  • 3
  • 4
  • 5
  • 6

第 2 题

longestSubarray 函数的时间复杂度是( )
{{ select(2) }}

  • O(n)O(n)
  • O(nlogn)O(n \log n)
  • O(n2)O(n^2)
  • O(Sn)O(S \cdot n)

第 3 题

longestSubarray 函数中,内层 while 循环的条件是 sum > S && left <= right。如果将其改为 while (sum > S)(去掉 left <= right),且输入数组全为正整数,则( )
{{ select(3) }}

  • 程序功能不变
  • 当所有元素和大于 S 时,left 可能超过 right,导致 sum -= a[left] 越界
  • 程序运行速度变慢
  • 程序会输出更大的答案

第 4 题

若输入为:

4 0
0 0 0 0

则程序输出为( )
{{ select(4) }}

  • 0
  • 1
  • 3
  • 4

第 5 题

若将第 12 行的 while (sum > S && left <= right) 修改为 while (sum > S),且输入为:

3 2
1 1 1

则程序输出为( )
{{ select(5) }}

  • 2
  • 3
  • 程序错误
  • 1

第 6 题

若将第 9 行的初始值 int left = 0, sum = 0, ans = 0; 改为 int left = 0, sum = 0, ans = 1;,其他代码不变,且输入为:

3 0
5 6 7

则程序输出为( )
{{ select(6) }}

  • 0
  • 1
  • 3
  • 程序错误