2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第1题)

第1题
cpp
1 #include <iostream>
2 using namespace std;
3
4 int n;
5 int d[1000];
6
7 int main() {
8 cin >> n;
9 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 的正整数,完成下面的判断题和单选题:
-
判断题
-
n 必须小于 1000,否则程序可能会发生运行错误。( )
A. 正确 B. 错误
-
输出一定大于等于 00。( )
A. 正确 B. 错误
-
若将第 13 行的
j=0改为j = i + 1程序输出可能会改变。 ( )A. 正确 B. 错误
-
将第 14 行的
d[i] < d[j]改为d[i] != d[j],程序输出不会改变。( )A. 正确 B. 错误
-
-
单选题
-
若输入 n为 100,且输出为 127,则输入的 d[i] 中不可能有( )。
A. 127
B. 126
C. 128
D. 125
-
若输出的数大于 0,则下面说法正确的是( )。
A. 若输出为偶数,则输入的 d[i]d [i ] 中最多有两个偶数
B. 若输出为奇数,则输入的 d[i]d [i ] 中至少有两个奇数
C. 若输出为偶数,则输入的 d[i]d [i ] 中至少有两个偶数
D. 若输出为奇数,则输入的 d[i]d [i ] 中最多有两个奇数
-
题目分析
给定代码的功能是:读入 n 和数组 d,然后通过双重循环计算所有满足 d[i] < d[j] 的数对 (i, j) 的表达式 d[i] + d[j] - (d[i] & d[j]) 的最大值,并输出该最大值(若没有满足条件的数对,则输出 -1)。实际上,d[i] + d[j] - (d[i] & d[j]) 等于 d[i] | d[j](按位或),因此程序求的是所有不同数值的数对(因为要求 d[i] < d[j],排除了相等的情况)的按位或的最大值。
判断题答案及解析
-
数组
d[1000]的下标范围是 0 到 999,因此当n ≤ 1000时,程序不会发生数组越界;当n > 1000时,必然越界。题目说"n 必须小于 1000",即要求n < 1000,但实际n = 1000也是合法的,因此该说法错误。
答案:B -
ans初始化为 -1,若没有满足d[i] < d[j]的数对(例如所有数相等或 n=1),则输出 -1,可能小于 0。因此说法错误。
答案:B -
原代码遍历所有
i, j,条件d[i] < d[j]使得每个不同数值的数对恰好被计算一次(因为若a < b,则只有a作为d[i]、b作为d[j]时成立)。改为j = i + 1后,只考虑i < j的情况,此时条件d[i] < d[j]可能漏掉那些索引较大但数值较小的数对(例如d[0]=5, d[1]=3就不会被计算)。因此输出可能改变。
答案:A -
原条件只计算
d[i] < d[j]的情况,每个不同数值的数对恰好出现一次。新条件计算所有d[i] != d[j]的情况,每个数对会出现两次(i和j互换),但两次的表达式值相同,因此最大值不变。所以输出不会改变。
答案:A
单选题答案解析
-
输出为 127 说明所有数对的按位或最大值是 127。若存在 128,则 128 与任何正整数的按位或至少为 128,会得到更大的值,矛盾。而 127、126、125 均可与其他数组合得到 127(例如 127 与 0 但 0 不是正整数,但可与 63 等组合;126 与 1 得 127;125 与 2 得 127)。因此不可能有 128。
答案:C -
输出是某对数的按位或。按位或的奇偶性:结果为偶数当且仅当两个数都是偶数;结果为奇数当且仅当至少有一个奇数。
- A:输出为偶数 → 存在两个偶数,但输入中可能有多个偶数,故"最多两个偶数"错误。
- B:输出为奇数 → 可能来自一个奇数和一个偶数,不一定需要两个奇数,故"至少两个奇数"错误。
- C:输出为偶数 → 必然存在两个偶数(因为只有两个偶数才能得到偶数结果),故"至少有两个偶数"正确。
- D:输出为奇数 → 输入中可以有多个奇数,故"最多两个奇数"错误。
答案:C
专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
1、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html
2、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html
3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html
4、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}