2012NOIP 普及组C++语言试题
第十八届全国青少年信息学奥林匹克联赛初赛
(普及组C++语言试题)
竞赛时间:2012年10月13日14:30~16:30
选手注意:
l 试题纸共有10页,答题纸共有2页,满分100分。请在答题纸上作答,写在试题纸上一律无效。
l 不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料
一、单项选择题(共20题,每题1.5分,共计30分;每题且仅有一个正确选项)
1.计算机如果缺少( ),将无法正常启动。
A.内存 B.鼠标 C. U盘 D. 摄像头
2.( )是一种先进先出的线性表。
A.栈 B.队列 C.哈希表(散列表) D.二叉树
3.目前计算机芯片(集成电路)制造的主要原料是( ),它是一种可以在沙子中提炼出的物质。
A.硅 B.铜 C.锗 D.铝
4.十六进制数9A在( )进制下是232。
A.四 B.八 C.十 D.十二
5.( )不属于操作系统。
A.Windows B.DOS C.Photoshop D.NOI Linux
6.如果一棵二叉树的中序遍历是BAC,那么它的先序遍历不可能是( )。
A.ABC B.CBA C.ACB D.BAC
7. 目前个人电脑的( )市场占有率最靠前的厂商包括Intel、AMD等公司。
A.显示器 B.CPU C.内存 D.鼠标
8. 使用冒泡排序对序列进行升序排列,每执行一次交换操作系统将会减少1个逆序对,因此序列 5,4,3,2,1需要执行( )次操作,才能完成冒泡排序。
A.0 B.5 C.10 D.15
9. 1946年诞生于美国宾夕法尼亚大学的ENIAC属于( )计算机。
A.电子管 B.晶体管 C.集成电路 D.超大规模集成电路
10. 无论是TCP/IP模型还是OSI模型,都可以视为网络的分层模型,每个网络协议都会被归入某一层中。如果用现实生活中的例子来比喻这些“层”,以下最恰当的是( )。
A. 中国公司的经理与波兰公司的经理交互商业文件
B. 军队发布命令
C. 国际会议中,每个人都与他国地位对等的人直接进行会谈
D. 体育比赛中,每一级比赛的优胜者晋级上一级比赛
11.矢量图(Vector Image)图形文件所占的贮存空间比较小,并且无论如何放大、缩小或旋转等都不会失真,是因为它( )。
A.记录了大量像素块的色彩值来表示图像
B.用点、直线或者多边形等基于数学方程的几何图元来表示图像
C.每个像素点的颜色信息均用矢量表示
D.把文件保存在互联网,采用在线浏览的方式查看图像
12. 如果一个栈初始时为空,且当前栈中的元素从栈顶到栈底依次为a,b,c,另有元素d已经出栈,则可能的入栈顺序是( )。
A.a, d, c, b B.b, a, c, d C.a, c, b, d D.d, a, b, c
13.( )是主要用于显示网页服务器或者文件系统的HTML文件的内容,并让用户与这些文件交互的一种软件。
A.资源管理器 B.浏览器 C.电子邮件 D.编译器
14.( )是目前互联网上常用的E-mail服务协议。
A.HTTP B.FTP C.POP3 D.Telnet
15.( )就是把一个复杂的问题分成两个或更多的相同类似的子问题,再把子问题分解成更小的子问题……直到最后的子问题可以简单地直接求解。而原问题的解就是子问题解的并。
A.动态规划 B.贪心 C.分治 D.搜索
16.地址总线的位数决定了CPU可直接寻址的内存空间大小,例如地址总线为16位,其最大的可寻址空间为64KB。如果地址总线是32位,则理论上最大可寻址的内存空间为( )。
A.128KB B.1MB C.1GB D.4GB
17.蓝牙和Wi-Fi都是( )设备。
A.无线广域网 B.无线城域网 C.无线局域网 D.无线路由器
18. 在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。
A.系统分配的栈空间溢出 B.系统分配的堆空间溢出
C.系统分配的队列空间溢出 D.系统分配的链表空间溢出
19. 原字符串中任意一段连续的字符所组成的新字符串称为子串。则字符“AAABBBCCC”共有( )个不同的非空子串。
A.3 B.12 C.36 D.45
20. 仿生学的问世开辟了独特的科学技术发展道路。人们研究生物体的结构、功能和工作原理,并将这些原理移植于新兴的工程技术中。以下关于仿生学的叙述,错误的是( )
A.由研究蝙蝠,发明雷达 B.由研究蜘蛛网,发明因特网
C.由研究海豚,发明声纳 D.由研究电鱼,发明伏特电池
二、问题求解(共2题,每题5分,共计10分)
1. 如果平面上任取n个整点(横纵坐标都是整数),其中一定存在两个点,它们连线的中点也是整点,那么n至少是__________。
2. 在NOI期间,主办单位为了欢迎来自各国的选手,举行了盛大的晚宴。在第十八桌,有5名大陆选手和5名港澳选手共同进膳。为了增进交流,他们决定相隔就坐,即每个大陆选手左右旁都是港澳选手,每个港澳选手左右旁都是大陆选手。那么,这一桌一共有_______种不同的就坐方案。
注:如果在两个方案中,每个选手左右相邻的选手相同,则视为同一种方案。
三、阅读程序写结果。(共4题,每题8分,共计32分)
1.
#include <iostream>
using namespace std;
int a,b,c,d,e,ans;
int main()
{
cin>>a>>b>>c;
d=a+b;
e=b+c;
ans=d+e;
cout<<ans<<endl;
return 0;
}
输入:1 2 5
输出:______________
2.
#include <iostream>
using namespace std;
int n,i,ans;
int main()
{
cin>>n;
ans=0;
for(i=1;i<=n;i++)1 1 1 1 1 1
if(n%i==0) ans++;
cout<<ans<<endl;
return 0;
}
输入:18
输出:_____________
3.
#include <iostream>
using namespace std;
int n,i,j,a[100][100];
int solve(int x,int y)
{
int u,v;
if(x==n) return a[x][y];
u=solve(x+1,y);
v=solve(x+1,y+1);
if(u>v) return a[x][y]+u;
else return a[x][y]+v;
}
int main()
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++) cin>>a[i][j];
cout<<solve(1,1)<<endl;
return 0;
}
输入:
5
2
-1 4
2 -1 -2
-1 6 4 0
3 2 -1 5 8
输出:______________
4.
#include <iostream>
#include <string>
using namespace std;
int n,i,j,ans;
string s;
char get(int i)
{
if(i<n) return s[i];
else return s[i-n];
}
int main()
{
cin>>s;
n=s.size();
ans=0;
for(i=1;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
if(get(i+j)<get(ans+j))
{
ans=i;
break;
}
else if(get(i+j)>get(ans+j)) break;
}
for(j=0;j<=n-1;j++) cout<<get(ans+j);
cout<<endl;
return 0;
}
输入:CBBADADA
输出:____________
四、完善程序(前2空每空2分,后8空每空3分,共计28分)
1.(坐标统计)输入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;
}
2. (排列数)输入两个正整数n,m(1<n<20,1<m<n),在1~n中任取m个数,按字典序从小到大输出所有这样的排列。例如:
输入:3 2
输出:1 2
1 3
2 1
2 3
3 1
3 2
#include <iostream>
#include <cstring>
using namespace std;
const int SIZE =25;
bool used[SIZE];
int data[SIZE];
int n,m,i,j,k;
bool flag;
int main()
{
cin>>n>>m;
memset(used,false,sizeof(used));
for(i=1;i<=m;i++)
{
data[i]=i;
used[i]=true;
}
flag=true;
while(flag)
{
for(i=1;i<=m-1;i++) cout<<data[i]<<" ";
cout<<data[m]<<endl;
flag= ① ;
for(i=m;i>=1;i--)
{
② ;
for(j=data[i]+1;j<=n;j++)
if(!used[j])
{
used[j]=true;
data[i]= ③ ;
flag=true;
break;
}
if(flag)
{
for(k=i+1;k<=m;k++)
for(j=1;j<= ④ ;j++)
if(!used[j])
{
data[k]=j;
used[j]=true;
break;
}
⑤ ;
}
}
}
return 0;
}
参考答案
一、单项选择题(共20题,每题1.5分,共计30分;每题且仅有一个正确选项)
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
A |
B |
A |
B |
C |
C |
B |
C |
A |
A |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
B |
D |
B |
C |
C |
D |
C |
A |
C |
B |
二、问题求解(共2题,每题5分,共计10分)
1. 5
2. 2880
三、阅读程序写结果。(共4题,每题8分,共计32分)
10
6
14
ACBBADAD
四、完善程序(前2空每空2分,后8空每空3分,共计28分)
1、
① 0
② y[j]<y[i]
③ f[i]=f[i]+1;
④(i>1)&& (f[i]>f[i-1])
⑤ ans=max_f
2、
① false
② used[data[i]]=flase
③ j
④ n
⑤ break