CSP-S 2024 提高级 第一轮(初赛) 阅读程序(1)

news2024/9/25 0:50:20

【题目】

CSP-S 2024 提高级 第一轮(初赛) 阅读程序(1)

1 #include <iostream> 
2 using namespace std; 
3 
4 const int N = 1000; 
5 int c[N]; 
6 
7 int logic(int x, int y) { 
8     return (x & y) ^ ((x ^ y) | (~x & y)); 
9 } 
10 void generate(int a, int b, int *c) { 
11     for (int i = 0; i < b; i++) { 
12         c[i] = logic(a, i) % (b + 1); 
13     } 
14 } 
15 void recursion(int depth, int *arr, int size) { 
16     if (depth <= 0 || size <= 1) return; 
17     int pivot = arr[0]; 
18     int i = 0, j = size - 1; 
19     while (i <= j) { 
20         while (arr[i] < pivot) i++; 
21         while (arr[j] > pivot) j--; 
22         if (i <= j) { 
23             int temp = arr[i]; 
24             arr[i] = arr[j]; 
25             arr[j] = temp; 
26             i++;j--; 
27         } 
28     } 
29     recursion(depth - 1, arr, j + 1); 
30     recursion(depth - 1, arr + i, size - i); 
31 } 
32 
33 int main() { 
34     int a, b, d; 
35     cin >> a >> b >> d; 
36     generate(a, b, c); 
37     recursion(d, c, b); 
38     for (int i = 0; i < b; i++) cout << c[i] << " "; 
39     cout<<endl; 
40 }

判断题:

  1. 当 1000>=d>=b 时,输出的序列是有序的( )
  2. 当输入“5 5 1”时,输出为“1 1 5 5 5”( )
  3. 假设数组 c 长度无限制,该程序所实现的算法的时间复杂度是 O(b)的( )
    单选题:
  4. 函数 int logic(int x,int y)的功能是( )
    A. 按位与
    B. 按位或
    C. 按位异或
    D. 以上都不是
  5. 当输入为“10 100 100”时,输出的第 100 个数是( )
    A.91
    B.94
    C.95
    D.98

【题目考点】

1. 状态压缩

一个二进制数表示一个集合,一个x位二进制数从低位到高位分别为:第0位,第1位,…,第x-1位。
第i位为0表示集合中不存在第i元素。
第i位为1表示集合中存在第i元素。
集合A、B分别由二进制数a、b表示,那么集合运算可以通过二进制数位运算来完成
集合运算包括:

  • A与B的交集 A ∩ B A\cap B AB:在A中且在B中的元素构成的集合
  • A与B的并集 A ∪ B A\cup B AB:在A中或在B中的元素构成的集合
  • A与B的差集 A − B A-B AB:在A中但不在B中的元素构成的集合
  • B关于全集A的补集 A \ B A\backslash B A\B:B是A的子集,在A中但不在B中元素构成的集合
集合运算集合运算公式位运算
取交集 A ∩ B A\cap B ABa & b
取并集 A ∪ B A\cup B ABa | b
取差集 A − B A-B ABa & ~b
取B关于A的补集 A \ B A\backslash B A\Ba ^ b

当B不是A的子集时,a ^ b表示的是在A中但不在B中的元素,以及在B中但不在A中元素构成的集合,即 ( A − B ) ∪ ( B − A ) (A-B)\cup (B-A) (AB)(BA) ( A ∪ B ) − ( A ∩ B ) (A\cup B) - (A\cap B) (AB)(AB)
当A和B没有交集时,a ^ b表示的集合为 A ∪ B A\cup B AB
在这里插入图片描述

【解题思路】

7 int logic(int x, int y) { 
8     return (x & y) ^ ((x ^ y) | (~x & y)); 
9 } 

先看logic函数,如果仅仅从位运算角度来看,会感觉该运算十分复杂。但如果学过状态压缩,把x、y两个二进制数字当做集合X、Y的集合状态,那么~x & y就是Y与X的差集 Y − X Y-X YX,也就是在集合Y中但不在集合X中的元素构成的集合。
x ^ y表示在X中但不在Y中的元素,以及在Y中但不在X中元素构成的集合,也就是 ( X − Y ) ∪ ( Y − X ) (X-Y)\cup (Y-X) (XY)(YX)
(x ^ y) | (~x & y)就是求二者的并集 ( X − Y ) ∪ ( Y − X ) ∪ ( Y − X ) = ( X − Y ) ∪ ( Y − X ) (X-Y)\cup (Y-X) \cup (Y-X)=(X-Y)\cup (Y-X) (XY)(YX)(YX)=(XY)(YX),而该集合也可以表示为 ( X ∪ Y ) − ( X ∩ Y ) (X\cup Y) - (X\cap Y) (XY)(XY)
x & y表示集合 X ∩ Y X\cap Y XY,该集合与 ( X − Y ) ∪ ( Y − X ) (X-Y)\cup (Y-X) (XY)(YX)没有交集,两个没有交集的集合进行按位或|,或者按位异或^运算的结果都是两集合的并集。
因此(x & y) ^ ((x ^ y) | (~x & y)) ( X ∩ Y ) ∪ ( ( X ∪ Y ) − ( X ∩ Y ) ) = X ∪ Y (X\cap Y)\cup ((X\cup Y) - (X\cap Y))=X\cup Y (XY)((XY)(XY))=XY
所以logic函数的返回值就是x | y

10 void generate(int a, int b, int *c) { 
11     for (int i = 0; i < b; i++) { 
12         c[i] = logic(a, i) % (b + 1); 
13     } 
14 } 

generate函数就是对c数组进行赋值,使c[i]的值为(a|i)%(b+1)

15 void recursion(int depth, int *arr, int size) { 
16     if (depth <= 0 || size <= 1) return; 
17     int pivot = arr[0]; 
18     int i = 0, j = size - 1; 
19     while (i <= j) { 
20         while (arr[i] < pivot) i++; 
21         while (arr[j] > pivot) j--; 
22         if (i <= j) { 
23             int temp = arr[i]; 
24             arr[i] = arr[j]; 
25             arr[j] = temp; 
26             i++;j--; 
27         } 
28     } 
29     recursion(depth - 1, arr, j + 1); 
30     recursion(depth - 1, arr + i, size - i); 
31 } 

应该能看出,这是在做二路快速排序。pivot是标杆元素,选择第1个元素作为标杆元素。前面的下标i选择大于等于pivot的元素,后面的下标j选择小于等于pivot的元素,二者交换。交换后前面的元素较小,后面的元素较大,因此该函数进行的是升序排序。
而这里增加了depth参数,当depth为0时,不再进行递归。depth是最大的递归深度,也就是说只进行最大递归深度为depth的快速排序。

33 int main() { 
34     int a, b, d; 
35     cin >> a >> b >> d; 
36     generate(a, b, c); 
37     recursion(d, c, b); 
38     for (int i = 0; i < b; i++) cout << c[i] << " "; 
39     cout<<endl; 
40 }

主函数中,先输入a、b、d。
使用a、b通过generate函数生成数组c,下标从0~b-1。
对数组c进行最大递归层数为d的快速排序,而后输出数组c。

【试题答案及解析】

判断题:
1.当 1000>=d>=b 时,输出的序列是有序的( )
答:T
b是c数组元素个数,c数组长度为N是1000,因此b的值最大可以达到1000。d是快速排序的递归层数,最坏情况下,要想完成排序,递归层数会等于元素个数。当递归层数d大于等于元素个数b时,一定可以完成对数组c的排序。

2. 当输入“5 5 1”时,输出为“1 1 5 5 5”( )
答:F
已知a=5,b=5,d=1。
根据 c [ i ] = ( a ∣ i ) % ( b + 1 ) = ( 5 ∣ i ) % 6 c[i] = (a|i)\%(b+1)=(5|i)\%6 c[i]=(ai)%(b+1)=(5∣i)%6,求出c数组

i01234
c[i]55115

选择c[0]为标杆元素,从前向后找第一个大于等于c[0]的元素是c[0],从后向前找第一个小于等于c[0]的元素为c[4],二者交换,由于二者的数值都为5,所以c数组从数值角度来看没有变化。
由于递归层数d为1,因此只进行一趟选择和交换。输出应该为5 5 1 1 5。

3. 假设数组 c 长度无限制,该程序所实现的算法的时间复杂度是 O(b)的( )
答:F
generate函数和输出过程的复杂度都为 O ( b ) O(b) O(b)
对有b个元素的序列进行快速排序,递归层数最好情况下是 O ( l o g b ) O(logb) O(logb),最坏情况下是 O ( b ) O(b) O(b),由于该问题递归层数受输入的d的限制,因此递归层数为 O ( m i n ( l o g b , d ) ) ∼ O ( m i n ( b , d ) ) O(min(logb, d))\sim O(min(b, d)) O(min(logb,d))O(min(b,d))。每一层递归所遍历的元素平均有b个。因此recursion函数的时间复杂度为 O ( b ∗ m i n ( l o g b , d ) ) ∼ O ( b ∗ m i n ( b , d ) ) O(b*min(logb, d))\sim O(b*min(b, d)) O(bmin(logb,d))O(bmin(b,d))
该程序所实现的算法总体时间复杂度最好为 O ( b log ⁡ b ) O(b\log b) O(blogb),最坏为 O ( b 2 ) O(b^2) O(b2),该叙述错误。

单选题:
4. 函数 int logic(int x,int y)的功能是( )
A. 按位与
B. 按位或
C. 按位异或
D. 以上都不是

答:B
根据上述分析,可知logic实现的是x | y
该问题也可以通过列真值表的方法得出结果

xylogic(x, y)
000
011
101
111
与按位或运算的真值表相同。

5. 当输入为“10 100 100”时,输出的第 100 个数是( )
A.91
B.94
C.95
D.98

答:C
a = 10, b = 100, d = 100
由于 d ≥ b d\ge b db,所以recursion函数对c数组进行了完整的升序快速排序,输出的第100个数也就是整个序列中的最大值。
c数组中的元素通过公式 c [ i ] = ( a ∣ i ) % ( b + 1 ) = ( 10 ∣ i ) % 101 c[i] = (a|i)\%(b+1)=(10|i)\%101 c[i]=(ai)%(b+1)=(10∣i)%101生成,i是从0到99的整数。
将10在2进制下按位权展开: 10 = 2 + 2 3 10 = 2+2^3 10=2+23,转为二进制数后为 ( 10 ) 10 = ( 1010 ) 2 (10)_{10}=(1010)_2 (10)10=(1010)2
由于c[i]是一个数模101的结果,也就是说最终结果不能超过100。
现在需要找的是一个小于等于 ( 100 ) 10 (100)_{10} (100)10的,二进制下第1位和第3位必须为1的最大的数字。
从大到小枚举 ( 10 ∣ i ) (10|i) (10∣i)的值,看其第1位和第3位是否都为1

10|i十进制10|i二进制
1001100100
991100011
981100010
971100001
961100000
951011111

因此 ( 10 ∣ i ) (10|i) (10∣i)的最大值为95,即 ( 10 ∣ i ) % 101 (10|i)\%101 (10∣i)%101,也就是c数组中的最大值为95,因此输出的第100个数为95,选C。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【资源三号卫星】

资源三号卫星 资源三号卫星&#xff08;ZY-3&#xff09;&#xff0c;作为中国第一颗民用高分辨率光学传输型测绘卫星&#xff0c;于2012年1月9日成功发射&#xff0c;正式拉开了我国在高分辨率对地观测领域自主发展的序幕。以下是对资源三号卫星的详细介绍&#xff1a; 基本…

从Servlet+JSP+JDBC到MyBatis:重构用户CRUD操作的高效之旅

前言 原生的JDBC&#xff1a; 原生的JDBC操作数据库&#xff0c;书写较为繁琐&#xff0c;降低开发效率。JDBC的局限性&#xff08;如代码冗余、SQL语句与Java代码紧密耦合、难以维护等&#xff09;。 相比于JDBC&#xff0c;Mybatis的优势&#xff1a; SQL与Java代码的分离、强…

2-102基于matlab的蒙特卡洛仿真

基于matlab的蒙特卡洛仿真&#xff0c;对64QAM和BPSK进行蒙特卡洛仿真&#xff0c;并绘出误码率曲线。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a; 2-102基于matlab的蒙特卡洛仿真

初探shell与bash使用指南

文章目录 一、shell二、bash第一步、新建脚本第二步、添加权限第三步、执行bash脚本 在日常开发中&#xff0c;经常使用到Linux服务器相关知识&#xff0c;输入命令获取想要的结果&#xff0c;本篇介绍shell 与 bash的相关知识。 一、shell 是命令行解释器&#xff0c;接收用户…

云岚到家 第一天实战总结

为什么使用post发送请求&#xff0c;参数依旧会被拼接带url上呢&#xff1f;这应该就是param 与data传参的区别。即param传参数参数会被拼接到url后&#xff0c;data会以请求体传递 不一定post发送请求&#xff0c;数据一定在请求体中&#xff0c;主要是看数据的格式。 后端c…

Makefile的写法以及gdb调试的使用方法

all:main # 一般makefile中的第一个目标都是all:可执行文件 # 为了保证&#xff0c;最后Makefile文件执行后一定会生成一个可执行文件main:main.o add.o gcc main.o add.o -o main main.o:main.cgcc -c main.c -o main.o add.o:add.cgcc -c add.c -o add.oclean: …

无人机之4G模块的主要功能和优势

一、增强图传 在无人机飞行过程中&#xff0c;传统的图传方式可能会受到信号遮挡或干扰的影响&#xff0c;导致图像传输不稳定甚至中断。而4G模块通过结合4G网络技术&#xff0c;能够在原有图传技术的基础上提供增强的图传功能。当传统图传信号不佳时&#xff0c;无人机可以自动…

MySQL 缓冲池管理与常见优化技巧

在 MySQL 数据库的性能优化中&#xff0c;缓冲池的管理至关重要。同时&#xff0c;了解其他常见的优化技巧也能极大地提升数据库的运行效率。今天&#xff0c;我们就来深入探讨在 MySQL 中如何管理并调整缓冲池的大小&#xff0c;以及一些常见的优化技巧。 一、缓冲池的重要性…

ZBrush入门使用介绍——17、NanoMesh

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的用法&#xff0c;这次看看NanoMesh 一、 NanoMesh介绍 之前介绍过ArrayMesh&#xff0c;ArrayMesh可以把一个模型复制很多份。不过ArrayMesh有一个问题&#xff0c;复制了很多个网格之后&#xff0c;很难针对某部分网格做调…

鸿蒙开发(NEXT/API 12)【基础功能(Function Flow Runtime 开发)】任务并发调度

场景介绍 Function Flow编程模型是一种基于任务和数据驱动的并发编程模型&#xff0c;允许开发者通过任务及其依赖关系描述的方式进行应用开发。FFRT&#xff08;Function Flow运行时&#xff09;是支持Function Flow编程模型的软件运行时库&#xff0c;用于调度执行开发者基于…

《动手学深度学习》笔记1.10——激活函数←模型初始化←数值稳定性

目录 1. 数值稳定性 1.1 神经网络的梯度 1.2 数值稳定性的常见两个问题 1.3 梯度爆炸 1.3.1 MLP的例子 1.3.2 使用ReLU激活函数 1.3.3 产生的问题 1.4 梯度消失 1.4.1 使用sigmoid激活函数 1.4.2 梯度消失的问题 1.5 总结 2. 让训练更稳定 2.1 目标 (ResNet, LSTM…

8.进销存系统(基于springboot的进销存系统)

目录 1.系统的受众说明 2.开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 MySQL环境配置 2.4 idea介绍 2.5 mysql数据库介绍 2.6 B/S架构 3.系统分析与设计 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3经济可行性 3.4.1 数据库…

Java—反射机制详解

介绍反射 反射的基本概念 反射&#xff08;Reflection&#xff09;是Java语言中的一种机制&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法等类的内部结构。通过反射&#xff0c;你可以在运行时获取类的信息&#xff0c;包括类的构造器、字段、方法等&#xf…

k8s StorageClass 存储类

文章目录 一、概述1、StorageClass 对象定义2、StorageClass YAML 示例 二、StorageClass 字段1、provisioner&#xff08;存储制备器&#xff09;1.1、内置制备器1.2、第三方制备器 2、reclaimPolicy&#xff08;回收策略&#xff09;3、allowVolumeExpansion&#xff08;允许…

从碎片到整合:EasyCVR平台如何重塑城市感知系统的视频数据生态

随着城市化进程的加速&#xff0c;城市感知系统作为智慧城市的重要组成部分&#xff0c;正逐步成为提升城市管理效率、保障公共安全、优化资源配置的关键手段。EasyCVR视频汇聚融合平台&#xff0c;凭借其强大的数据整合、智能分析与远程监控能力&#xff0c;在城市感知系统中扮…

Sam Altman的博客:The Intelligence Age

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

thinkphp 做分布式服务+读写分离+分库分表+负载均衡(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表负载均衡&#xff08;分区&#xff09; 引言 thinkphp* 大道至简负载均衡分布式服务一、读写分离1、读写分离的实现方式2、主从同步的三种模式2-1、异步模式&#xff08;mysql async-mode&#xff09;2-2、半同步模式&#xff08;mysql s…

红帽rhce含金量?考到能拿多少钱工资?

随着目前国内的it职业飞速发展&#xff0c;rhce已经成为it职业的首选认证、高薪亮点。主要是linux人才出现大比例短缺的状况&#xff0c;很多企业对linux人才的需求也继续升温。 这个时候大家如果抓住了机会&#xff0c;那么实力就能得到质的提升&#xff0c;那么小编针对红帽…

OpenAI GPT-3 API: What is the difference between davinci and text-davinci-003?

题意&#xff1a;OpenAI GPT-3 API&#xff1a;davinci 和 text-davinci-003 有什么区别 问题背景&#xff1a; Im testing the different models for OpenAI, and I noticed that not all of them are developed or trained enough to give a reliable response. 我正在测试…

论文阅读【时间序列】ModerTCN (ICLR2024)

【时间序列】ModerTCN (ICLR2024) 原文链接&#xff1a;ModernTCN: A Modern Pure Convolution Structure for General Time Series Analysis 代码仓库&#xff1a;ModerTCN 简易版本实现代码可以参考&#xff1a;&#xff08;2024 ICLR&#xff09;ModernTCN&#xff1a;A Mod…