共48道题,当前是第16

初赛真题

01 #include <iostream>
02 using namespace std;
03 
04 int n;
05 int d[1000];
06 
07 int main() {
08     cin >> n;
09     for (int i = 0; i < n; ++i)
10         cin >> d[i];
11     int ans = -1;
12     for (int i = 0; i < n; ++i)
13         for (int j = 0; j < n; ++j)
14             if (d[i] < d[j])
15                 ans = max(ans, d[i] + d[j] - (d[i] & d[j]));
16     cout << ans;
17     return 0;
18 }
假设输⼊的 n 和 d[i] 都是不超过 10000 的正整数,完成下⾯的判断题和单选题

1. A。
2. B。
3. A。
4. A。
5. A。
6. D。

这段代码是在求一个序列当中,两个不同的数字的或的最大值。代码实现中比较有迷惑性就是这里的 d[i] + d[j] - (d[i] & d[j]) ,但是仔细观察其在二进制中所包含的意义就可以发现这实际上跟 d[i] | d[j] 是等价的。'),

Question

1. n 必须⼩于 1000 ,否则程序可能会发⽣运⾏错误

2. 输出⼀定⼤于等于 0

3. 若将第 13 ⾏ for (int j = 0; j < n; ++j) 的 j = 0 改为 j = i + 1 , 程序输出可能会改变

4. 将第 14 ⾏的 d[i] < d[j] 改为 d[i] != d[j] ,程序输出不会改变。

5. 若输⼊ n 为 100 , 且输出为 127 , 则输⼊的 d[i] 中不可能有 ( )

6. 若输出的数⼤于 0 ,则下⾯说法正确的是( )