2019csp-j初赛试题及解
(2020-09-16 22:06:20)分类: 试题解 |
一)单项选择題:
1)俺国的顶级域名,有点含糊,它实际上有两个.cn 和 .com.cn,这里的标准答案不如说是排除法,选(A)
2)2.二进制数11 1011 1001 0111和01 0110 1110 1011进行逻辑与运算的结果是()。
A. 01 0010 1000 1011 B. 01 0010 1001 0011
C. 01 0010 1000 0001 D. 01 0010 1000 0011
这个不说了,答案就是解析;选(D)
3).一个32位整型变量占用()个字节。
A. 32 B. 128 C. 4 D. 8
正确答案: C
解析:一个字节是8位,32位整型变量,占用4个字节,选(C)
4).若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0)
s = a;
for (b = 1; b <= c; b++) s = s - 1;
则与上述程序段功能等价的赋值语句是()
A. s = a - c; B. s = a - b;
C. s = s - c; D. s = b - c;
答案:A
5).设有100个已排好序的数据元素,采用折半查找时,最大比较次数为()
A. 7 B. 10 C. 6 D. 8
正确答案: A
答案x, 2^6 < x < 2^7
6)链表不具有的特点是()
A. 插入删除不需要移动元素 B. 不必事先估计存储空间
C. 所需空间与线性表长度成正比 D. 可随机访问任一元素
正确答案: 也是原版照搬的老題目,答案(D)
7).把8个同样的球放在5个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的分法?()
提示:如果8个球都放在一个袋子里,无论是哪个袋子,都只算同一种分法。
A. 22 B. 24 C. 18 D. 20
其实就是放苹果,f(8,5)是多少?答案(C)
8).一棵二叉树如右图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i ,则其左孩子位于下标2i处、右孩子位于下标2i+l处),则该数组的最大下标至少为()。
A. 6 B. 10 C. 15 D. 12
完全二叉树的老題目,一个字没改,记住"左孩子=2*i,右孩子=2*i+1",其实题面也给出答案了
答案(C)
10)319和377的最大公约数是()。
A. 27 B. 33 C. 29 D. 31
319和377的最大公约数是多少?用碾转相除法做做就知道了。答案(C)
11)
新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。
方案一:每次连续跑3公里可以消耗300千卡(耗时半小时);
方案二:每次连续跑5公里可以消耗600千卡(耗时1小时)。
小胖每周周一到周四能抽出半小时跑步,周五到周日能抽出一小时跑步。
另外,教练建议小胖每周最多跑21公里,否则会损伤膝盖。
请问如果小胖想严格执行教练的训练方案,并且不想损伤膝盖,每周最多通过跑步消耗多少千卡?()
A. 3000 B. 2500 C. 2400 D. 2520
答案(C)
12)—副纸牌除掉大小王有52张牌,四种花色,每种花色13张。
假设从这52张牌中随机抽取13张纸牌,则至少()张牌的花色一致。
A. 4 B. 2 C. 3 D. 5
会打拱猪的都知道,答案是(A),如果从排列组合上看,为什么呢?
13)13.—些数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是9, 9颠倒过来看还是6,其他数字颠倒过来都不构成数字。
类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901。假设某个城市的车牌只由5位数字组成,每一位都可以取0到9。
请问这个城市最多有多少个车牌倒过来恰好还是原来的车牌?()
A. 60 B. 125 C. 75 D. 100
又是一題排列组合;xyzyx
答案(C)
14)假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为()。
A. ABCDEFGHIJ
B. ABDEGHJCFI
C. ABDEGJHCFI
D. ABDEGHJFIC
答案(B)
15)是图灵奖(A)
二)阅读程序(与前几次的NOIP初赛,有很大不同,最的区别,需要自已组织输入数据,但是……,问的题不少,数据似乎需要不少,所以,这类题,如果不是看出它是做什么的,就先模拟一下)
1)第一题比较简单,主要是适应问答的新形式。
#include "bits/stdc++.h"
using namespace std;
char st[100];
int main(){
scanf("%s",st);
int
n=strlen(st);
for(int
i=1;i<=n;i++){//原第8行
if(n%i==0){
char c=st[i-1];
if(c>='a')
st[i-1]=c-'a'+'A';
}
}
printf("%s",st);
return
0;
}
对错判断題:
1)输入的字符串,只能由小写字母或大写字母组成;( )//程序里似乎没这样说
2)若将第8行的i=1;改成i=0;程序运行出错;( )//i-1的问題
3)若将第8行的i<=n;改为"i*i <=n",程序运行结果不会改变;( 错
);
//这里不是说质因子
4)若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样;(
)//没看出异样,应该可以
选择題:
5)若输入的字符串长度为18,那么输入的字符串与输出的字符串,至多有多少个字符不同?(问題在于“至多”,怎么定义条件?)
答案是B
6)输入的字符串长度为多少时,输入的字符串与输出的字符串相比,至多有36个字符不同?(在上述前提下,等于说,要多大的数,才有36个因数)
答数是(B)
2)第二题开始有点复杂,左左右右的不容易跟踪,还是动手模拟一下。可以先看看输入的问答要求:相同的,不同的,偶数的……,在10以内取一系列值,自已画个表格出来,模拟一下过程。这题就不会答错了。
实际上是记录两个数列之中,彼此最大的影射;
由于这题是“程序清楚,不容易想像”,自已创造比较简单的数据模拟,可以帮助自已很快看清楚。
#include "bits/stdc++.h"
using namespace std;
int n,m;
int a[100],b[100];
int main(){
scanf("%d%d",&n,&m);
for(int
i=1;i<=n;i++)a[i]=b[i]=0;
for(int
i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(a[x] < y && b[y] <
x)//第13行
{
if(a[x] > 0) b[a[x]]=0;//第15行 旧记录复0
if(b[y] > 0) a[b[y]]=0;//旧记录复0
a[x]=y;
b[y]=x;//建立链记录;
}
}
int
ans=0;
for(int
i=1;i<=n;i++)
{
if(a[i]==0) ++ans;//26行
if(b[i]==0) ++ans;//27行
}
printf("%d\n",ans);
}
假设输入的n,m都是正整数,x,y都在[1,n]范围内;
伪代码解读,似乎是一对对建立最小的链接,其他清0;
判断題
1)当m > 0时,输出的值一定小于2n。( );//既然是计算剩下的数,应该对的
2)执行完第27行的++ans时,ans一定是偶数( );//不同组的x,y,有可能有一个数相同呢
3)a[i]和b[i]不可能同时大于0。( );
//这是什么意思?那俩是数组啊?可能是说,同步扫描a[]和b[],也就是问26行27行,是不是可能同时为0;这是不对称链接,不是a[i]和b[i]链接,说不通;
4)若程序执行到第13行时,x总是小于y,那么第15行不会被执行;(
)
//这是链接,跟x和y谁大谁小,没有关系;
解題同样是按照上述步骤:1)注解,2)根据題目,代入测试数据;
即便不确定伪代码解读,针对題目代入数据后,就清晰了。
问題在于,如果反复代入数据,时间可能就变得紧张了;
唯一的指望就是,代入一两次之后,对題目已经清楚了,后面不花多少时间。
选择題
5)若m个x两两不同,且m个y两两不同,则输出的值为是多少?
//代入测试数据再数,比“想它的道理”要容易;
//每个x都不同,y也不同,那么就是每一个链接都是新的;
A.2n-2m
B.2n+2
C.2n-2; D.2n
答案A
6)若m个x两两不同,且m个y两两相同,则输出的值为是多少?
A.2n-2
B.2n
C.2m
D.2n-2m
同上。每題都想一想到透,时间未必比代进测试数据试一试短;
用测试数据,反而有重复性;
答案A
3)第三题并不比第二题复杂,但很容易先人为主,以为它是二分法。
这一題不容易代入数据,但是流程比较清楚。可以用比较小的数据代进入,再按倍数推算。
没有数据确定代入以前,看这些题,回答它的问,确实是让人有点抓瞎的。
如果乱猜的话,就很难命中了。
#include "iostream"
using namespace std;
const int maxn=10000;
int n;
int a[maxn];
int b[maxn];
int f(int l,int r,int depth){
if(l>r)
return 0;
int
min=maxn,mink;
for(int
i=l;i<=r;i++){
if(min > a[i]){//第12行
min=a[i];
mink=i;
}
}
int
lres=f(l,mink-1,depth+1);
int
rres=f(mink+1,r,depth+1);
return
lres+rres+depth*b[mink];
}
int main(){
cin>>n;
for(int
i=0;i < n;i++) cin>>a[i];
1)俺国的顶级域名,有点含糊,它实际上有两个.cn 和 .com.cn,这里的标准答案不如说是排除法,选(A)
2)2.二进制数11 1011 1001 0111和01 0110 1110 1011进行逻辑与运算的结果是()。
A. 01 0010 1000 1011 B. 01 0010 1001 0011
C. 01 0010 1000 0001 D. 01 0010 1000 0011
这个不说了,答案就是解析;选(D)
3).一个32位整型变量占用()个字节。
A. 32 B. 128 C. 4
正确答案: C
解析:一个字节是8位,32位整型变量,占用4个字节,选(C)
4).若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值(c大于0)
s = a;
for (b = 1; b <= c; b++) s = s - 1;
则与上述程序段功能等价的赋值语句是()
A. s = a - c; B. s = a - b;
C. s = s - c; D. s = b - c;
答案:A
5).设有100个已排好序的数据元素,采用折半查找时,最大比较次数为()
A. 7 B. 10 C. 6 D. 8
正确答案: A
答案x, 2^6 < x < 2^7
6)链表不具有的特点是()
A. 插入删除不需要移动元素 B. 不必事先估计存储空间
C. 所需空间与线性表长度成正比 D. 可随机访问任一元素
正确答案: 也是原版照搬的老題目,答案(D)
7).把8个同样的球放在5个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的分法?()
提示:如果8个球都放在一个袋子里,无论是哪个袋子,都只算同一种分法。
A. 22 B. 24 C. 18 D. 20
其实就是放苹果,f(8,5)是多少?答案(C)
8).一棵二叉树如右图所示,若采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i ,则其左孩子位于下标2i处、右孩子位于下标2i+l处),则该数组的最大下标至少为()。
A. 6 B. 10 C. 15 D. 12
完全二叉树的老題目,一个字没改,记住"左孩子=2*i,右孩子=2*i+1",其实题面也给出答案了
答案(C)
9).100以内最大的素数是()。
A. 89 B. 97 C. 91 D. 93
送分题。答案B
10)319和377的最大公约数是()。
A. 27 B. 33 C. 29 D. 31
319和377的最大公约数是多少?用碾转相除法做做就知道了。答案(C)
11)
新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。
方案一:每次连续跑3公里可以消耗300千卡(耗时半小时);
方案二:每次连续跑5公里可以消耗600千卡(耗时1小时)。
小胖每周周一到周四能抽出半小时跑步,周五到周日能抽出一小时跑步。
另外,教练建议小胖每周最多跑21公里,否则会损伤膝盖。
请问如果小胖想严格执行教练的训练方案,并且不想损伤膝盖,每周最多通过跑步消耗多少千卡?()
A. 3000 B. 2500 C. 2400 D. 2520
答案(C)
12)—副纸牌除掉大小王有52张牌,四种花色,每种花色13张。
假设从这52张牌中随机抽取13张纸牌,则至少()张牌的花色一致。
A. 4 B. 2 C. 3 D. 5
会打拱猪的都知道,答案是(A),如果从排列组合上看,为什么呢?
13)13.—些数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是9, 9颠倒过来看还是6,其他数字颠倒过来都不构成数字。
类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901。假设某个城市的车牌只由5位数字组成,每一位都可以取0到9。
请问这个城市最多有多少个车牌倒过来恰好还是原来的车牌?()
A. 60 B. 125 C. 75 D. 100
又是一題排列组合;xyzyx
答案(C)
14)假设一棵二叉树的后序遍历序列为DGJHEBIFCA,中序遍历序列为DBGEHJACIF,则其前序遍历序列为()。
A. ABCDEFGHIJ
B. ABDEGHJCFI
C. ABDEGJHCFI
D. ABDEGHJFIC
答案(B)
15)是图灵奖(A)
二)阅读程序(与前几次的NOIP初赛,有很大不同,最的区别,需要自已组织输入数据,但是……,问的题不少,数据似乎需要不少,所以,这类题,如果不是看出它是做什么的,就先模拟一下)
1)第一题比较简单,主要是适应问答的新形式。
#include "bits/stdc++.h"
using namespace std;
char st[100];
int main(){
}
对错判断題:
1)输入的字符串,只能由小写字母或大写字母组成;( )//程序里似乎没这样说
2)若将第8行的i=1;改成i=0;程序运行出错;( )//i-1的问題
3)若将第8行的i<=n;改为"i*i <=n",程序运行结果不会改变;(
//这里不是说质因子
4)若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样;(
选择題:
5)若输入的字符串长度为18,那么输入的字符串与输出的字符串,至多有多少个字符不同?(问題在于“至多”,怎么定义条件?)
答案是B
6)输入的字符串长度为多少时,输入的字符串与输出的字符串相比,至多有36个字符不同?(在上述前提下,等于说,要多大的数,才有36个因数)
答数是(B)
2)第二题开始有点复杂,左左右右的不容易跟踪,还是动手模拟一下。可以先看看输入的问答要求:相同的,不同的,偶数的……,在10以内取一系列值,自已画个表格出来,模拟一下过程。这题就不会答错了。
实际上是记录两个数列之中,彼此最大的影射;
由于这题是“程序清楚,不容易想像”,自已创造比较简单的数据模拟,可以帮助自已很快看清楚。
#include "bits/stdc++.h"
using namespace std;
int n,m;
int a[100],b[100];
int main(){
假设输入的n,m都是正整数,x,y都在[1,n]范围内;
伪代码解读,似乎是一对对建立最小的链接,其他清0;
判断題
1)当m > 0时,输出的值一定小于2n。( );//既然是计算剩下的数,应该对的
2)执行完第27行的++ans时,ans一定是偶数( );//不同组的x,y,有可能有一个数相同呢
3)a[i]和b[i]不可能同时大于0。( );
//这是什么意思?那俩是数组啊?可能是说,同步扫描a[]和b[],也就是问26行27行,是不是可能同时为0;这是不对称链接,不是a[i]和b[i]链接,说不通;
4)若程序执行到第13行时,x总是小于y,那么第15行不会被执行;(
//这是链接,跟x和y谁大谁小,没有关系;
解題同样是按照上述步骤:1)注解,2)根据題目,代入测试数据;
即便不确定伪代码解读,针对題目代入数据后,就清晰了。
问題在于,如果反复代入数据,时间可能就变得紧张了;
唯一的指望就是,代入一两次之后,对題目已经清楚了,后面不花多少时间。
选择題
5)若m个x两两不同,且m个y两两不同,则输出的值为是多少?
//代入测试数据再数,比“想它的道理”要容易;
//每个x都不同,y也不同,那么就是每一个链接都是新的;
A.2n-2m
答案A
6)若m个x两两不同,且m个y两两相同,则输出的值为是多少?
A.2n-2
同上。每題都想一想到透,时间未必比代进测试数据试一试短;
用测试数据,反而有重复性;
答案A
3)第三题并不比第二题复杂,但很容易先人为主,以为它是二分法。
这一題不容易代入数据,但是流程比较清楚。可以用比较小的数据代进入,再按倍数推算。
没有数据确定代入以前,看这些题,回答它的问,确实是让人有点抓瞎的。
如果乱猜的话,就很难命中了。
#include "iostream"
using namespace std;
const int maxn=10000;
int n;
int a[maxn];
int b[maxn];
int f(int l,int r,int depth){
}
int main(){