(江苏省"信息与未来"小学生编程思维展示活动题册——150分钟)
活动须知:
1.压缩包中包含除题面样例外,不便于排版的额外样例数据。
2.请严格按照题目要求用小写文件名p1.cpp、p2.cpp、.....、p6.cpp命名你的程序,并按照机房老师要求建立目录、提交源代码。提交代码大小限制为100KB。
3.程序直接使用cin或scanf读入数据,使用cout或printf输出,不需要打开输入或输出文件。
4.所有测试点运行时间限制为1s(以实际评测机为准),内存限制为1GB。
第一题(p1.cpp,10分):幸运数字
如果把一个数字十进制表示的奇数位和偶数位分别相加得到的和相同,小小就认为它是一个幸运的数字。例如:
12345奇数位相加1+3+5=9、偶数位相加2+4=6,因此12345不是幸运数字;. 2332奇数位相加2+3=5、偶数位相加3+2=5,因此2332是幸运数字。
对于给定的a和b,小小希望你求出a, a+1,a+2,...,b 中幸运数字的数量。
输入格式
输入数据仅一行,包含空格分隔的两个整数a和b。
输出格式
输出一行一个整数,代表a,a+1,a+2,...,b中幸运数字的数量。
样例输入1
1 100
样例输出1
9
样例输入2
4096 65536
样例输出2
3454
数据规模
对于100%的数据,满足1≤a≤b≤1,000,000。
第二题(p2.cpp,15分):精密计时
小小有一个非常精密的计时器,每秒可以计数100次(两个连续的时钟计数之间恰好间隔百分之一秒)。例如,以下是从13:01:02.37到13:01:03.01的计时过程:
13:01:02.37 (13 时1分2秒.37)
13:01:02.38
13:01:02.39...
13:01:02.98
13:01:02.99 (13 时1分2秒.99)13:01:03.00 (13 时1分3秒.00)
13:01:03.01
小小记录了计时器上的两个时刻,你能帮助他计算这两个时刻之间经过了多少个“百分之一秒”吗?
输入格式
输入数据仅一行,包含空格分开的两个字符串,代表了两个计时器上显示的时刻。时刻中的时、分、秒、百分之一秒均使用两位十进制数字表示,不足两位时在十位添零。时、分、秒之间用冒号∶分隔,秒和百分之一秒之间用小数点.分隔。
输出格式
输出一行一个整数,代表两个时刻之间经过的“百分之一秒”数。
样例输入1
01:02:34.56 01:03:00.10
样例输出1
2554
样例输入2
00:00:00.00 23:59:59.99
样例输出2
8639999
数据规模
- 对于100%的数据,两个时刻都来自24小时制的同一天(00:00:00.00到23:59:59.99),且保证后一个时刻晚于前一个时刻。
第三题(p3.cpp,15分):图像重建
JWST(詹姆斯·韦伯太空望远镜,James Webb Space Telescope)是一台红外波段的大型太空望远镜,由美国国家航空航天局(NASA)、欧洲航天局(ESA)和加拿大航天局(CSA)共同合作开发。它是哈勃太空望远镜的科学继任者,旨在解决一系列重要的天文学问题,包括宇宙的起源、星系的形成和演化、恒星和行星系统的形成,以及寻找宜居行星和生命迹象。
以下是JWST望远镜5月23日采集的深空图像:
太空望远镜在采集数据时,并不像我们日常生活中的手机或相机“一次拍摄成像”直接从传感器数据得到照片,而是由多次不同时段拍摄的图像拼接而成。在这个问题中,我们也来实现图像的拼接重建。
我们已经对一个区域拍摄了两张黑白图像。这两张图像面向同一区域拍摄,因此我们预期它们有相当一部分都是重叠的。你的任务就是将两张图像经过上下左右平移后尽可能“重叠”在一起,满足重叠部分所有像素均完全相同,且重叠部分的面积尽可能大(即重叠部分的像素数量尽可能多)。
输入格式
输入数据由两张图像的描述组成。两张图像的描述之间有一个空行。
对于每张图像,第一行包含两个整数n和m,代表了图像的尺寸(像素的行数和列数)。接下来n行,每行m个像素描述了拍摄的图像,其中0表示一个黑色像素,1表示一个白色像素。每一行的像素由一个空格分隔。
输出格式
输出一行一个整数,即经过最优平移后,重叠部分的像素数量。
样例输入1
3 3
0 0 00 1 101 12 41 1 0 01 1 0 1
样例输出1
4
压缩包中包含更多的样例数据。
数据规模
对于100%的数据,满足1≤n, m≤50。
第四题(p4.cpp,20分):程序分析
程序分析技术是一种用于理解和改进计算机程序的方法。它可以帮助我们找出程序中的错误、提高程序的性能、优化代码结构等。其中,静态分析技术在不运行程序的情况下对程序代码进行分析。它可以检查代码的语法、风格、潜在错误等。例如,静态分析可以帮助我们找出程序中未使用的变量、可能的数组越界等问题。
小小设计了一个自己的编程语言,并命名为X语言。你能为它设计一个静态分析器吗?
X语言程序中只有两个整型变量α和y,且无需定义,可以直接使用。变量a的值从程序外输入(输入值可以是任何C++ int范围内的值),y的初始值是0。一个X语言程序由若干行组成,每行恰好包含一条命令,是以下三种命令之一:
- 条件分支: if (条件){
- 对y赋值:y =数字;
- 条件结束:}
其中,“条件”要么是“x>数字”,要么是“×<数字”。赋值语句和条件中的“数字”都是1到1,000,000,000之间的常数。if和赋值的含义同C++语言中的条件和赋值语句。
请你编写一个静态分析器,分析一个X语言程序执行结束时,所有可能的y的值。
输入格式
输入数据第一行为整数n,代表程序的行数。
接下来n行,每行一个命令,描述了一个合法的X语言程序:输入的程序保证括号配对,且符合问题描述中的约定。为了便于大家解析(例如用cin或scanf读入),输入程序中的if后、{前、=、<、>左右都恰好有一个空格,行首可能有若干空格缩进。除此之外,输入不含多余的空格或空白字符。
输出格式
输出一行,从小到大不重复地输出程序结束时,变量y所有可能的值。数字之间由一个空格隔开。
样例输入1
10
if (x > 1) {
y = 2;
if (× > 10) {
y = 1;
y = 4;
if (x < 5){
y = 3;
}
}
}
样例输出1
0 2 4
压缩包中包含更多的样例数据。
数据规模
对于100%的数据,满足n ≤1,000。输入数据的每行都不超过1,000个字符。
第五题(p5.cpp,20分):文本压缩
数据压缩算法的目的是减少数据的大小,以便更快地传输和存储。我们经常会用到的zip、rar等压缩工具,就是利用数据压缩算法把多个文件或者文件夹压缩成一个更小的文件;我们的网页在传输时,通常也使用了gzip压缩。有些时候(例如传输图像、视频时),我们会允许在压缩过程中损失一些精度,以实现更好的压缩比。
在这个问题里,你需要自己设计一个英文文本的无损压缩和解压缩算法。你的程序需要同时实现压缩器和解压缩器两部分功能:
- 压缩器输入一个仅由小写字母组成的字符串,输出一个压缩后的字符串。压缩后的字符串允许使用大写字母、小写字母和数字,但不允许使用其他字符。
- 解压缩器输入一个压缩后的字符串,还原出小写字母的字符串。
注意,在这个问题中,所有给压缩器的输入都来自人工智能GPT-3.5-turbo 生成的英文文本保留字母(并转换为小写)后得到的,也就是说,你可以假设除了偶尔的例外,字符串是由英文单词拼接而成的。这个性质是解决问题的关键-―随机序列的压缩比“有规律”序列的压缩要困难得多。
输入格式
输入数据第一行为一个大写英文单词,代表压缩/解压缩的任务类型。“COMPRESS”代表压缩;“DECOMPRESS”代表解压缩。
第二行一个字符串,是压缩/解压缩任务对应的文本。对于压缩任务,是一个仅包含小写字母的字符串;对于解压缩任务,字符串总是来自你程序之前COMPRESS压缩的结果。
输出格式
输出一行一个字符串。对于压缩任务,输出一行为压缩后的文本;对于解压缩任务,输出一行为解压缩后的文本。
样例数据
见压缩包。样例仅给出了压缩任务所需的字符串(由人工智能GPT-3.5-turbo生成),不含样例输出;你可以在给出的样例上实验你的压缩算法。
数据规模
对于100%的数据,输入字符串的长度n满足30,000 ≤n ≤40,000。
评测说明与评分标准
本题的评测机会两次调用你的程序:
- 第一次调用你的程序执行压缩任务,例如输入
COMPRESS
aaaaaaaabbbbbbbbbb
假设本次调用,你的程序输出了a8b10作为压缩后的文本。这个输出会被评测系统记住。
- 第二次,调用你的程序执行解压缩任务。针对刚才的例子,我们会为你的程序输入
DECOMPRESS
a8b10
如果你的程序解压缩输出aaaaaaaabbbbbbbbbb(即正确解压缩得到原字符串),则被判定为“还原正确”。
对于每个测试数据,压缩和解压缩分别有1s 的运行时间限制。
对于每个测试数据,在解压缩能正确得到原字符串的前提下:
- 如果压缩率达到75%(压缩字符串的长度小于等于输入长度的3/4),该测试点得满分。
- 如果压缩率达到80%(压缩字符串的长度小于等于输入长度的4/5),该测试点得一半分数。
第六题(p6.cpp,20分):电路布线
电路布局布线(Circuit Layout and Routing)是电子设计自动化(EDA)领域的一个重要概念,它涉及到在电路板或集成电路上安排和连接电子元件的过程。这个过程的目标是在满足电气性能、信号完整性、电磁兼容性等要求的同时,实现对空间、成本和生产工艺的优化。
小小现在需要解决一个简化的电路布线问题,在一个n x m的方格中进行电路布线。其中:
- 井号#标记的格子已经被占用,不能布线。
- 加号+标记的格子会连接到电路的其他部分,必须被布线。在给定的电路布线问题中,至少有一个格子必须被布线。
- 点号.标记的格子小小有权选择是否布线:布线即将该格标记为加号,不布线即保持为点号。
小小的任务是选择尽可能多的格子进行布线(将“·”的格子标记为“+”),满足:
- 布线电路连通。即从任意一个已布线的格子,都能通过上、下、左、右移动到相邻已布线格子的方式,到达任意另一个布线的格子。
- 布线不存在短路(回路),即不存在某个布线的格子能通过 >2 步的上、下、左、右移动到相邻布线格子的方式回到自身,且经过的格子各不相同。
例如,以下是一个电路布线问题,已有三个格子被标记为必须布线(加号):
#....#
....+#.+###
#.+...#
以下展示了一种合法和两种不合法的布线方案:
输入格式
输入第一行是两个空格分隔的整数n和m,代表布线问题格子的行数和列数。接下来n行,每行m个字符(#,+,.中的一个),描述了具体的布线问题。输入数据保证至少存在一种合法的布线方案。输入数据中至少有一个+。
输出格式
输出n行,每行m个字符,代表最优的布线方案,其中被布线的格子尽可能多。如有多种可能的方案,输出任意一种即可。
样例输入1
2 2
+...
样例输出1
+.
++
样例输入2
3 5
...+#..###
....+
样例输出2
++++#
.+###
+++++
样例输入3
5 6
..++...#..#.
.#..#.
.#..#.
......
样例输出3
++++++
+#.+#+
+#+.#+
+#++#+
++.+++
数据规模
- 对于40%的数据,满足n x m ≤ 16。
- 对于100%的数据,满足n, m ≤6。
评分标准
在你的布线方案合法(连通且无回路)的前提下:
- 如果你的方案是最优布线方案,即布线的格子最多,该测试点得满分。
- 否则,该测试点得一半分数。