#1798. 初赛练习
初赛练习
当前没有测试数据。
全国青少年信息学奥林匹克联赛初赛模拟考试(四)
( 普及组 C++ 语言 两小时完成 )
●● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●●
一、单项选择题(共 15 题,每题 2 分,共计 30 分。每题有且仅有一个正确选项。)
1、补码(10011001)2的原码是()
A、10011001 B、01100110
C、11100110 D、11100111
2、计算机中,决定计算机寻址大小的是()
A、内存 B、寄存器
C、数据总线 D、地址总线
3、在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。
A.系统分配的栈空间溢出 B.系统分配的堆空间溢出
C.系统分配的队列空间溢出 D.系统分配的链表空间溢出
4、从 ENIAC 到当前最先进的计算机,冯·诺依曼体系结构始终占有重要的地位。冯·诺依曼体系结构的核心内容是( )。
A、采用开关电路 B、采用半导体器件
C、采用存储程序和程序控制原理
D、采用键盘输入
5、在 C++程序中,表达式 23|2^5 的值是( )
A. 23 B. 1 C.32 D.18
6、已知7个结点的二叉树的先根遍历是1 2 4 5 6 3 7(数字为结点的编号,以下同),中根遍历 是4 2 6 5 1 7 3,则该二叉树的后根遍历是( )
A. 4 6 5 2 7 3 1 B. 4 6 5 2 1 3 7
C. 4 2 3 1 5 4 7 D. 4 6 5 3 1 7 2
7、一颗完全二叉树可以使用数组表示,现在标记根为0(即数组第0个元素为二叉树的根),已知一个节点的下标为i,则该节点的父节点下标为()。
A、(i+1)/2 B、i-2
C、(i-1)/2 D、i/2
8、已知一个栈的空间大小为3,元素 a b c d e 顺序入栈,那么下面不能的出栈顺序是()
A、a b c d e B、b c d e a
C、d c b a e D、c d e b a
9、( )就是把一个复杂的问题分成两个或更多的相同类似的子问题,再把子问题分解成更小的子问题……直到最后的子问题可以简单地直接求解。而原问题的解就是子问题解的并。
A.动态规划 B.贪心 C.分治 D.搜索
10、与十进制数28.5625相等的四进制数是()
A、130.5625 B、13.21 C、130.21 D、130.5
11、已知x=(0.1011010)2 ,则[X/2]补=( )2
A、0.1011101 B、11110110
C、0.0101101 D、0.100110
12、地面上有标号为A、B、C的三根柱,在A柱上放有10个直径相同中间有孔的圆盘,从上到下依次编号为1,2,3……,将A柱上的部分盘子经过B柱移入C柱,也可以在B柱上暂存。如果B柱上的操作记录为“进、进、出、进、进、出、出、进、进、出、进、出、出”。那么,在C柱上,从下到上的编号为( )。
A.2 4 3 6 5 7 B.2 4 1 2 5 7
C.2 4 3 1 7 6 D.2 4 3 6 7 5
13、完全二叉树的节点个数为11,则它的最后一层叶结点个数为( )。
A.4 B.3 C.5 D.2
14、对一个有向图而言,如果每个节点都存在到达其他任何节点的路径,那么就称它是强连通的。例如,右图就是一个强连通图。事实上,在删掉边( )后,它依然是强连通的。
A、a B、b
C、c D、d
15、现在有5个字母 A、B、C、D、E出现的频率分别为10,2,3,5,8,问由这些字母构成的哈夫曼树最长的编码长度为( )。
A、1 B、2 C、3 D、4
二、阅读程序写结果(共 4 题,每题 8 分,共计 32 分)
1、
1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4 void my_strip(char* str){
5 int len = strlen(str);
6 if( 0 == len )
7 return;
8 for( int i = 0; i < len; ++i )
9 if( isalpha(str[i]) )
10 str[i] |= 32;
11 else if( str[i] == ' ')
12 str[i] = ':';
13 }
14 int main(){
15 char str[64];
16 gets(str);
17 my_strip(str);
18 cout << str;
19 return 0;
20 }
判断题 1、第10行str[i] |=32换成str[i]+=32效果相同() 2、 函数my_strip参数在64位系统下占8个字节() 3、 若没有6 7两行,程序也能正常运行() 4、 16行gets输入可能会读入超过64个字符() 选择题 5、输入数据 Are you ok,那么输出的结果为() A.Are you ok B. Are You Ok C. are:you:ok D.ARE:YOU:OK 6、若输入5个连续空格,那么输出结果为() A.无输出 B.: C.5: D.:::::
2、
1 #include <iostream>
2 using namespace std;
3 #define COUNT 6
4 int cocktail_sort(int* a,int size){
5 int times = 0;
6 for(int i = 0; i < size/2; ++i){
7 bool bchanged = false;
8 for(int j = 0; j< size-i; ++j){
9 if( j+1 < size && a[j] > a[j+1]){
10 bchanged = true;
11 swap(a[j],a[j+1]);
12 }
13 }
14 if( !bchanged )
15 break;
16 for(int k = size-i-1; k > 0; --k){
17 if( k >= 1 && a[k] < a[k-1] )
18 swap(a[k],a[k-1]);
19 }
20 times++;
21 }
22 return times;
23 }
24 int main(){
25 int a[COUNT];
26 for( int i = 0; i < COUNT; ++i)
27 cin >> a[i];
28 cout << cocktail_sort(a,COUNT) << endl;
29 }
判断题 1、 COUNT是一个变量() 2、 如果将数组a放在全局,那么cocktail_sort可以不传参数() 3、 若将第14 15行注释掉,程序效果相同() 4、若输入数据全部相同,最后将输出1() 选择题 5、若输入数据 10 1 2 3 4 5,那么输出的结果为() A.1 B.2 C.3 D.4 6、若输入数据 10 5 3 2 4 1,那么输出结果为() A.1 B.2 C.3 D.4
3、
1 #include<iostream>
2 using namespace std;
3 void foo(int a, int b, int c){
4 if(a > b)
5 foo(c, a, b);
6 else
7 cout<<a<<','<<b<<','<<c<<endl;
8 }
9 int main(){
10 int a, b, c;
11 cin >> a >> b >> c;
12 foo(a, b, c);
13 return 0;
14 }
判断题 1、第四行为递归的终止条件() 2、foo函数没有返回值() 选择题 3、若输入数据7 6 5,那么结果为()。 A.7,6,5 B.5,7,6 C.5,6,7 D.7,5,6 4、若输入数据3 1 2,则结果为()。 A.3,1,2 B.1,2,3 C.2,3,1 D.2,1,3 5、如果第4行修改为if (a>b && c > b),那么第三题的结果为()。 A.7,6,5 B.5,7,6 C.5,6,7 D.7,5,6 6、(4分)在最坏的情况下,foo将会被调用几次() A.1 B.2 C.3 D.4
三、完善程序(每小题3分,总共30分) 1、快速排序为常用的排序,请完善下面程序。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
void quick_sort(int a[],int left,int right)
{
if( left >= right )
return ;
int pivot = a[(left+right)>>1];
int i = left;
int j = right;
while( ① )
{
while( a[j] > pivot )
② ;
while( a[i] < pivot )
++i;
if( i <= j )
{
③ ;
--j;++i;
}
}
④ ;
quick_sort(a,i,right);
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
for( int i = 0; i < n; i++)
scanf("%d",&a[i]) ;
⑤ ;
for(int i = 0; i < n; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
1)①处应填() A.i <= j B. i < j C. i == j D. i >= j 2) ②处应填() A.j++ B. j-- C. i++ D. i— 3) ③处应填() A.swap(a[i-1],a[j]) B. swap(a[i],a[j]) C. swap(a[i],a[j-1]) D. swap(a[i+1],a[j+1]) 4) ④处应填() A.quick_sort(a,right,j) B. quick_sort(a,left,i) C. quick_sort(a,left,i+1) D. quick_sort(a,left,i-1) 5) ⑤处应填() A.quick_sort(a,0,n) B. quick_sort(a,1,n) C. quick_sort(a,0,n-1) D. quick_sort(a,0,n)
2、 (坐标统计)输入n个整点在平面上的坐标。对于每个点,可以控制所有位于它左下方的点(即x、y坐标都比它小),它可以控制的点的数目称为“战斗力”。依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高,输出其中最大的编号)。
#include <iostream>
using namespace std;
const int SIZE =100;
int x[SIZE],y[SIZE],f[SIZE];
int n,i,j,max_f,ans;
int main()
{
cin>>n;
for(i=1;i<=n;i++) cin>>x[i]>>y[i];
max_f=0;
for(i=1;i<=n;i++)
{
f[i]= ① ;
for(j=1;j<=n;j++)
{
if(x[j]<x[i] && ② )
③ ;
}
if( ④ )
{
max_f=f[i];
⑤ ;
}
}
for(i=1;i<=n;i++) cout<<f[i]<<endl;
cout<<ans<<endl;
return 0;
}
1)①处应填() A.1 B. n C. i+1 D. 0 2) ②处应填() A.y[j]>y[i] B. y[j]<y[i] C. y[j]>=y[i] D. y[j]<=y[i] 3) ③处应填() A.f[i]+1 B. f[j]+1 C. f[i]++ D.f[j]++ 4) ④处应填() A.f[i]>max_f B. f[i]>=max_f C. f[j]>=max_f D. f[j]>max_f 5) ⑤处应填() A.ans = i B. ans = i++ C. ans = j D. ans = f[i]