题库 信息学奥赛题库 题目列表 2021年CSP-S提高组初赛阅读程序题: #include&nb...
组合题

2021年CSP-S提高组初赛阅读程序题:

 #include <algorithm>
 #include <iostream>
 using namespace std;
 
 int n, a[1005]; 
 
 struct Node 
 {  
    int h, j, m, w; 
 
    Node(const int _h, const int  j, const int  m, const int _w):
        h(_h), j(_j), m(_m), w( w)
    { } 
 
    Node operator+(const Node &o) const
    {
        return Node(
            max(h, w + o.h),
            max(max(j, 0.j),m + o.h),
            max(m + o.w, o.m),
            w + o.w);
    }
 }
 
 Node solve1(int h, int m)
 {
     if (h > m)
         return Node(-1, -1, -1, -1);
     if (h == m)
         return Node(max(a[h], 0), max(a[h], 0), max(a[h], 0), a[h]);
     int j = (h + m) >> 1;
     return solve1(h,j) + solve1(j + 1, m);
 }
 
 int solve2(int h, int m)
 {
     if (h > m)
         return -1;
     if (h == m)
         return max(a[h], 0);
     int j = (h + m) >> 1;
     int wh = 0, wm = 0;
     int wht = 0, wmt = 0;
     for (int i = j; i >= h; i--) {
         wht += a[i];
         wh = max(wh, wht);
     }
     for (int i = j + 1; i <= m; i++) {
         wmt += a[i];
         wm = max(wm, wmt);
     }
     return max(max(solve2(h, j), solve2(j + 1, m)), wh + wm);
 } 
 
 int main()
 { 
     cin >> n;
     for (int i = 1; i <= n; i++) cin >> a[i];
     cout << solve1(1, n).j <<endl;
     cout << solve2(1, n) << endl;
     return 0;
 }

假设输入的所有数的绝对值都不超过 1000,完成下面的判断题和单选题:

第1题 判断

程序总是会正常执行并输出两行两个相等的数。(  )

A.
正确
B.
错误
第2题 判断

第 28行与第 38行分别有可能执行两次及以上。(  )

A.
正确
B.
错误
第3题 判断

当输入为“5-1011-95-7”时,输出的第二行为“7”。(  )

A.
正确
B.
错误
第4题 单选

solve1(1n) 的时间复杂度为(  )。

A.

Θ(logn)

B.

Θ(n) 

C.

Θ(nlogn)

D.

Θ(n2)

第5题 单选

solve2(1n) 的时间复杂度为(  )。

A.

Θ(logn)

B.

Θ(n)

C.

Θ(nlogn)

D.

Θ(n2)

第6题 单选

当输入为“10 -3 2 10 0 -8 9 -4 -5 9 4”时,输出的第一行为(  

A.

13

B.

17

C.

24

D.

12

题目信息
2021年 初赛 阅读程序
-
正确率
0
评论
141
点击