CSP-J/S 2020 第二轮认证 入门级
CSP-J/S 2020 第二轮认证 入门级
- 场次:2020年11月
- 考试时长:210 分钟
- 满分:400 分
- 题目来源:第三方来源(社区转写,非官方,仅供参考)
编程题
本分区标题为平台补的结构性占位,原卷(来源件)未收录。
优秀的拆分
C++时间 1 s内存 256 MB 文件 IO:power.in → power.out
一般来说,一个正整数可以拆分成若干个正整数的和。
例如,1=1,10=1+2+3+4 等。对于正整数 n 的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,n 被分解为了若干个不同的 2 的正整数次幂。注意,一个数 x 能被表示成 2 的正整数次幂,当且仅当 x 能通过正整数个 2 相乘在一起得到。
例如,10=8+2=23+21 是一个优秀的拆分。但是,7=4+2+1=22+21+20 就不是一个优秀的拆分,因为 1 不是 2 的正整数次幂。
现在,给定正整数 n,你需要判断这个数的所有拆分中,是否存在优秀的拆分。若存在,请你给出具体的拆分方案。
输入格式
从文件 power.in 中读入数据。
输入只有一行,一个正整数 n,表示需要判断的数。
输出格式
输出到文件 power.out 中。
若存在优秀的拆分,则从大到小输出拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定了拆分数字的顺序后,该拆分方案是唯一的。
若不存在优秀的拆分,输出 -1。
样例
6
4 2
6=4+2=22+21 是一个优秀的拆分。注意,6=2+2+2 不是一个优秀的拆分,因为拆分成的 3 个数不满足每个数互不相同。
7
-1
126
64 32 16 8 4 2
数据范围
对于 20% 的数据,n≤10。
对于另外 20% 的数据,保证 n 为奇数。
对于另外 20% 的数据,保证 n 为 2 的正整数次幂。
对于 80% 的数据,n≤1024。
对于 100% 的数据,1≤n≤1×107。
部分分
- 100 分
全部 20 个测试点等分;数据范围见 constraintsMd 各百分比档。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB
判题结果
直播获奖
C++时间 1 s内存 256 MB 文件 IO:live.in → live.out
NOI2130 即将举行。为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线。
更具体地,若当前已评出了 p 个选手的成绩,则当前计划获奖人数为 max(1,⌊p×w%⌋),其中 w 是获奖百分比,⌊x⌋ 表示对 x 向下取整,max(x,y) 表示 x 和 y 中较大的数。如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多。
作为评测组的技术人员,请你帮 CCF 写一个直播程序。
输入格式
从文件 live.in 中读入数据。
第一行有两个正整数 n,w,分别表示选手总数与获奖率。
第二行有 n 个非负整数,依次表示逐一评出的选手成绩。
输出格式
输出到文件 live.out 中。
输出一行 n 个非负整数,依次表示选手成绩逐一评出后,即时的获奖分数线。相邻两个整数之间用一个空格分隔。
样例
10 60 200 300 400 500 600 600 0 300 200 100
200 300 400 400 400 500 400 400 300 300
设已评测选手人数为 p,计划获奖人数为 max(1,⌊p×w%⌋)。
| 已评测选手人数 p | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 计划获奖人数 | 1 | 1 | 1 | 2 | 3 | 3 | 4 | 4 | 5 | 6 |
已评测选手的分数从高到低排列(分数线用粗体标出):
| p | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 分数 | 200 | 300, 200 | 400, 300, 200 | 500, 400, 300, 200 | 600, 500, 400, 300, 200 | 600, 600, 500, 400, 300, 200 | 600, 600, 500, 400, 300, 200, 0 | 600, 600, 500, 400, 300, 300, 200, 0 | 600, 600, 500, 400, 300, 300, 200, 200, 0 | 600, 600, 500, 500, 400, 300, 300, 200, 100, 0 |
注意,在第 9 名选手的成绩评出之后,计划获奖人数为 5 人,但由于有并列,因此实际会有 6 人获奖。
10 30 100 100 600 100 100 100 100 100 100 100
100 100 600 600 600 600 100 100 100 100
数据范围
各测试点的 n 如下表:
| 测试点编号 | n= |
|---|---|
| 1∼3 | 10 |
| 4∼6 | 500 |
| 7∼10 | 2000 |
| 11∼17 | 10000 |
| 18∼20 | 100000 |
对于所有测试点,每个选手的成绩均为不超过 600 的非负整数,获奖百分比 w 是一个正整数且 1≤w≤99。
在计算计划获奖人数时,如用浮点类型的变量(如 C/C++ 中的 float 、double,Pascal 中的 real 、double 、extended 等)存储获奖比例 w%,则计算 5×60% 时的结果可能为 3.000001,也可能为 2.999999,向下取整后的结果不确定。因此,建议仅使用整型变量,以计算出准确值。
部分分
- 15 分
测试点 1∼3:n=10。
- 15 分
测试点 4∼6:n=500。
- 20 分
测试点 7∼10:n=2000。
- 35 分
测试点 11∼17:n=10000。
- 15 分
测试点 18∼20:n=100000。
原文保真说明:原卷印刷错误 2 处(照原卷保留,未作修改)
原卷印刷如此其它数据范围
原卷作
| $11 \sim 17$ | $10000$ |原卷 pg-04 测试点表 n 上界印作 10000(非 10^4 写法),照录。
原卷印刷如此其它数据范围
原卷作
| $18 \sim 20$ | $100000$ |原卷 pg-04 测试点表 n 上界印作 100000(非 10^5 写法),照录。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB
判题结果
表达式
C++时间 1 s内存 256 MB 文件 IO:expr.in → expr.out
小 C 热衷于学习数理逻辑。有一天,他发现了一种特别的逻辑表达式。在这种逻辑表达式中,所有操作数都是变量,且它们的取值只能为 0 或 1,运算从左往右进行。如果表达式中有括号,则先计算括号内的子表达式的值。特别的,这种表达式有且仅有以下几种运算:
- 与运算:
a & b。当且仅当 a 和 b 的值都为 1 时,该表达式的值为 1。其余情况该表达式的值为 0。 - 或运算:
a | b。当且仅当 a 和 b 的值都为 0 时,该表达式的值为 0。其余情况该表达式的值为 1。 - 取反运算:
!a。当且仅当 a 的值为 0 时,该表达式的值为 1。其余情况该表达式的值为 0。
小 C 想知道,给定一个逻辑表达式和其中每一个操作数的初始取值后,再取反某一个操作数的值时,原表达式的值为多少。
为了化简对表达式的处理,我们有如下约定:
表达式将采用后缀表达式的方式输入。
后缀表达式的定义如下:
- 如果 E 是一个操作数,则 E 的后缀表达式是它本身。
- 如果 E 是 E1 op E2 形式的表达式,其中 op 是任何二元操作符,且优先级不高于 E1 、E2 中括号外的操作符,则 E 的后缀式为 E1′E2′op,其中 E1′ 、E2′ 分别为 E1、E2 的后缀式。
- 如果 E 是 E1 形式的表达式,则 E1 的后缀式就是 E 的后缀式。
同时为了方便,输入中:
- 与运算符(&)、或运算符(|)、取反运算符(!)的左右均有一个空格,但表达式末尾没有空格。
- 操作数由小写字母 x 与一个正整数拼接而成,正整数表示这个变量的下标。例如:
x10,表示下标为 10 的变量 x10。数据保证每个变量在表达式中出现恰好一次。
输入格式
从文件 expr.in 中读入数据。
第一行包含一个字符串 s,表示后缀表达式。
第二行包含一个正整数 n,表示表达式中变量的数量。表达式中变量的下标为 1,2,…,n。
第三行包含 n 个整数,第 i 个整数表示变量 xi 的初值。
第四行包含一个正整数 q,表示询问的个数。
接下来 q 行,每行一个正整数,表示需要取反的变量的下标。注意,每一个询问的修改都是临时的,即之前询问中的修改不会对后续的询问造成影响。
数据保证输入的表达式合法。变量的初值为 0 或 1。
输出格式
输出到文件 expr.out 中。
输出一共有 q 行,每行一个 0 或 1,表示该询问下表达式的值。
样例
x1 x2 & x3 | 3 1 0 1 3 1 2 3
1 1 0
该后缀表达式的中缀表达式形式为 (x1andx2)orx3。
- 对于第一次询问,将 x1 的值取反。此时,三个操作数对应的赋值依次为 0,0,1。原表达式的值为 (0&0)∣1=1。
- 对于第二次询问,将 x2 的值取反。此时,三个操作数对应的赋值依次为 1,1,1。原表达式的值为 (1&1)∣1=1。
- 对于第三次询问,将 x3 的值取反。此时,三个操作数对应的赋值依次为 1,0,0。原表达式的值为 (1&0)∣0=0。
x1 ! x2 x4 | x3 x5 ! & & ! & 5 0 1 0 1 1 3 1 3 5
0 1 1
该表达式的中缀表达式形式为 (notx1)and(not((x2orx4)and(x3and(notx5))))。
数据范围
对于 20% 的数据,表达式中有且仅有与运算(&)或者或运算(|)。
对于另外 30% 的数据,∣s∣≤1000,q≤1000,n≤1000。
对于另外 20% 的数据,变量的初值全为 0 或全为 1。
对于 100% 的数据,1≤∣s∣≤1×106,1≤q≤1×105,2≤n≤1×105。
其中,∣s∣ 表示字符串 s 的长度。
部分分
- 100 分
全部 20 个测试点等分;数据范围见 constraintsMd 各百分比档。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB
判题结果
方格取数
C++时间 1 s内存 256 MB 文件 IO:number.in → number.out
设有 n×m 的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的方格中的整数,求它能取到的整数之和的最大值。
输入格式
从文件 number.in 中读入数据。
第一行有两个正整数 n,m。
接下来 n 行,每行 m 个整数,依次代表每个方格中的整数。
输出格式
输出到文件 number.out 中。
输出一行一个整数,表示小熊能取到的整数之和的最大值。
样例
3 4 1 -1 3 2 2 -1 4 -1 -2 2 -3 -1
9
按走法 (1,1)→(2,1)→(2,2)→(2,3)→(1,3)→(1,4)→(2,4)→(3,4),取到的数之和为 1+2+(−1)+4+3+2+(−1)+(−1)=9,可以证明为最大值。原卷【样例 1 解释】含路径示意图(pg-08),此处仅转写文字说明。
2 5 -1 -1 -3 -2 -7 -2 -1 -4 -1 -2
-10
按走法 (1,1)→(1,2)→(1,3)→(1,4)→(2,4)→(2,5),取到的数之和为 (−1)+(−1)+(−3)+(−2)+(−1)+(−2)=−10,可以证明为最大值。因此,取到的数之和的最大值也可能是负数。原卷【样例 2 解释】含路径示意图(pg-09)。
数据范围
对于 20% 的数据,n,m≤5。
对于 40% 的数据,n,m≤50。
对于 70% 的数据,n,m≤300。
对于 100% 的数据,1≤n,m≤103。方格中整数的绝对值不超过 104。
部分分
- 100 分
全部 20 个测试点等分;数据范围见 constraintsMd 各百分比档。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB