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

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 的正整数,完成下面的判断题和单选题:

  • 判断题

    1. n 必须小于 1000,否则程序可能会发生运行错误。( )

      A. 正确 B. 错误

    2. 输出一定大于等于 00。( )

      A. 正确 B. 错误

    3. 若将第 13 行的 j=0 改为 j = i + 1 程序输出可能会改变。 ( )

      A. 正确 B. 错误

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

      A. 正确 B. 错误

  • 单选题

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

      A. 127

      B. 126

      C. 128

      D. 125

    2. 若输出的数大于 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],排除了相等的情况)的按位或的最大值。

判断题答案及解析
  1. 数组 d[1000] 的下标范围是 0 到 999,因此当 n ≤ 1000 时,程序不会发生数组越界;当 n > 1000 时,必然越界。题目说"n 必须小于 1000",即要求 n < 1000,但实际 n = 1000 也是合法的,因此该说法错误。
    答案:B

  2. ans 初始化为 -1,若没有满足 d[i] < d[j] 的数对(例如所有数相等或 n=1),则输出 -1,可能小于 0。因此说法错误。
    答案:B

  3. 原代码遍历所有 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

  4. 原条件只计算 d[i] < d[j] 的情况,每个不同数值的数对恰好出现一次。新条件计算所有 d[i] != d[j] 的情况,每个数对会出现两次(ij 互换),但两次的表达式值相同,因此最大值不变。所以输出不会改变。
    答案:A

单选题答案解析
  1. 输出为 127 说明所有数对的按位或最大值是 127。若存在 128,则 128 与任何正整数的按位或至少为 128,会得到更大的值,矛盾。而 127、126、125 均可与其他数组合得到 127(例如 127 与 0 但 0 不是正整数,但可与 63 等组合;126 与 1 得 127;125 与 2 得 127)。因此不可能有 128。
    答案:C

  2. 输出是某对数的按位或。按位或的奇偶性:结果为偶数当且仅当两个数都是偶数;结果为奇数当且仅当至少有一个奇数。

    • 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;
}
相关推荐
闻缺陷则喜何志丹21 小时前
【构造 前缀和】P8902 [USACO22DEC] Range Reconstruction S|普及+
c++·算法·前缀和·洛谷·构造
老四啊laosi21 小时前
[C++进阶] 16. 继承
c++·继承
实心儿儿21 小时前
C++ —— 继承
开发语言·c++
AMoon丶21 小时前
C++基础-类、对象
java·linux·服务器·c语言·开发语言·jvm·c++
17(无规则自律)21 小时前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode·哈希算法
样例过了就是过了21 小时前
LeetCode热题100 子集
数据结构·c++·算法·leetcode·dfs
free-elcmacom1 天前
C++三种参数传递方式:从交换函数看值、指针与引用的区别
开发语言·c++
柏木乃一1 天前
Linux线程(8)基于单例模式的线程池
linux·运维·服务器·c++·单例模式·操作系统·线程
Trouvaille ~1 天前
【贪心算法】专题(三):排序、博弈与区间的贪婪法则
c++·算法·leetcode·青少年编程·面试·贪心算法·蓝桥杯
IT19951 天前
C++工作笔记-动态库中的单例类存储方式
开发语言·c++·笔记