2009年第十五届全国青少年信息学奥林匹克联赛初赛试题
以下是NOIP2009年普及组(C++语言)的参考答案与评分标准:
一、单项选择题:
题号 1 2 3 4 5 答案 D B C A B 二、问题求解: 70 5 三、阅读程序写结果: 输出为 4 输出为 416 输出为 782 输出为 NPOI 四、完善程序: 填空说明: 空①: 0 空②: hash[i][j]++ 或其他等价方式 空③: ans++ 或其他等价方式 空④: hash[i][j]-- 或其他等价方式 完整代码示例: `c++ int a[101]; int n, m, k, ans; int hash[5][5]; void work(int x, int y, int tot) { if (tot == k) { ans++; return; } do { while (hash[x][y]) { y++; if (y == m) { x++; y = 0; if (x == n) return; } if (x == n) return; } for (int i = x - 1; i <= x + 1; i++) { if (i >= 0 && i < n) { for (int j = y - 1; j <= y + 1; j++) { if (j >= 0 && j < m) hash[i][j]++; } } } work(x, y, tot + 1); } while (true); } int main() { cin >> n >> m >> k; ans = 0; memset(hash, 0, sizeof(hash)); work(0, 0, 0); cout << ans << endl; return 0; } ` 以上解答确保了每一步的正确性,并符合题目要求的所有条件和约束条件。
一. 单项选择题 (共 20 题,每题 1.5 分,共计 30 分。每题有且仅有一个正确答案。)
1 、 关于图灵机下面的说法哪个是正确的:
A) 图灵机是世界上最早的电子计算机。
B) 由于大量使用磁带操作, 图灵机运行速度很慢。
该机械式计算装置由英国数学家艾伦·图 Turing创造出来,在二战期间作为关键的技术手段成功协助盟军破译德军密码
D) 图灵机只是一个理论上的计算模型。
2、关于计算机内存下面的说法哪个是正确的:
Random Access Memory(RAM) refers to the fact that when a program is running, the specific memory addresses allocated to it are unpredictable and cannot be precisely determined.
B) 1MB 内存通常是指 1024*1024 字节大小的内存。
计算机内存从技术上讲被描述为包含主存、高速缓存和寄存器三大部分。
D) 一般内存中的数据即使在断电的情况下也能保留 2 个小时以上。
3、关于 BIOS 下面说法哪个是正确的:
A) BIOS 是计算机基本输入输出系统软件的简称。
BIOS中装入了一系列常用输入输出设备的驱动程序文件
C) BIOS 一般由操作系统厂商来开发完成。
D) BIOS 能提供各种文件拷贝、复制、删除以及目录维护等文件管理功能。
4 、关于 CPU 下面哪个说法是正确的:
A) CPU 全称为中央处理器(或中央处理单元) 。
B) CPU 可以直接运行汇编语言。
C) 同样主频下, 32 位的 CPU 比 16 位的 CPU 运行速度快一倍。
D) CPU 最早是由 Intel 公司发明的。
5 、关于 ASCII,下面哪个说法是正确的:
A) ASCII 码就是键盘上所有键的唯一编码。
B) 一个 ASCII 码使用一个字节的内存空间就能够存放。
C) 最新扩展的 ASCII 编码方案包含了汉字和其他欧洲语言的编码。
D) ASCII 码是英国人主持制定并推广使用的。
6、下列软件中不是计算机操作系统的是:
A) Windows B) Linux C) OS/2 D) WPS
7、关于互联网,下面的说法哪一个是正确的:
A) 新一代互联网使用的 IPv6 标准是 IPv5 标准的升级与补充。
B) 互联网的入网 8 主机如果有了域名就不再需要 IP 地址。
C) 互联网的基础协议为 TCP/IP 协议。
D) 互联网上所有可下载的软件及数据资源都是可以合法免费使用的。
8、关于 HTML 下面哪种说法是正确的:
A) HTML 实现了文本、 图形、声音乃至视频信息的统一编码。
B) HTML 全称为超文本标记语言。
C) 网上广泛使用的 Flash 动画都是由 HTML 编写的。
D) HTML 也是一种高级程序设计语言。
9 、关于程序设计语言, 下面哪个说法是正确的:
A) 加了注释的程序一般会比同样的没有加注释的程序运行速度慢。
高级语言开发的应用程序不适合应用于低层次硬件设备上。
C) 高级语言相对于低级语言更容易实现跨平台的移植。
D) 以上说法都不对。
10 、已知大写字母A的ASCII编码为65 ( 10进制) ,则大写字母J的10进制ASCII编码为:
A) 71 B) 72 C) 73 D) 以上都不是
11、十进制小数125.125对应的8进制数是
A) 100.1 B) 175.175 C) 175.1 D) 100.175
- 六个元素FEDCBA自左向右依次排列进栈,在进栈的过程中可能会有一些元素被弹出。请判断以下哪一个不可能是一个合法的出栈序列?
A) EDCFAB B) DECABF C) CDFEBA D) BCDAEF
13 、 表达式 a*(b+c)-d 的后缀表达式是:
A) abcd*+- B) abc+d- C) abc+d- D) -+*abcd
14、一个包含 n 个分支结点 (非叶结点) 的非空二叉树, 它的叶结点数目最多为:
A) 2n + 1 B) 2n-1 C) n-1 D) n+1
15 、快速排序最坏情况下的算法时间复杂度为:
A) O(log2n) B) O(n) C) O(nlog2n) D) O(n2)
- 一个由4000个整数构成的有序序列(顺序表),假设这些整数已经按照升序顺序排列。那么在这种情况下,使用二分查找法确定某个特定元素的位置时,最多需要多少次比较才能判断该元素是否存在?
A) 11 次 B) 12 次 C) 13 次 D) 14 次
如果一个排序算法被认为是稳定的,则意味着当处理具有相同关键码的记录时,这些记录在排序前后的相对位置保持不变。请问以下哪种排列算法不具备这种稳定性?
A) 冒泡排序 B) 插入排序 C) 归并排序 D) 快速排序
- 给定一个包含n个顶点的有向图G,在G是一个strongly connected directed graph(即任意两个不同的顶点之间都存在一条有向路径)的情况下,则G中至少需要多少条有向边?
A) n B) n+1 C) n -1 D) n*(n-1)
19、请查阅全国信息学奥林匹克竞赛网站为参加信息学竞赛的教师和学生提供详细的竞赛资料和相关信息,请问该竞赛平台的具体网址是什么?
20 、在参加 NOI 系列竞赛过程中,下面哪一种行为是 不 被严格禁止的:
A) 携带书写工具, 手表和不具有通讯功能的电子词典进入赛场。
在联机测试过程中,在操作中通过手工推导出可能的答案,并将其直接输入程序以获取分数。
C) 通过互联网搜索取得解题思路。
D) 在提交的程序中启动多个进程以提高程序的执行效率。
二.问题求解(共 2 题, 每空 5 分,共计 10 分)
小陈有两个任务A和B需要完成。每个任务都有多个具体步骤需完成:A任务为a₁ → a₂ → a₃ ,而B任务则包括 b₁ → b₂ → b₃ → b₄ → b₅ 。任何时候小陈只能专注处理某一个任务的单一步骤。不过如果愿意的话,在完成当前手头的任务步骤后 ,他可以选择切换到另一个未完成的任务,并从其上次未处理的第一步继续 。需要注意的是所有操作必须按照既定顺序进行 ,例如 a₂ → b₂ → a₃ → b₃ …… 是允许的操作流程 ,但 a₂ → b₃ → a₃ → b₂ …… 这样的顺序则是不被允许的 。当恰巧完成某个特定环节并停工回家吃饭时 ,他只记得自己已经完成了整个A项工作而忘记了其他部分 。请问小陈在停工前可能已经执行了多少种不同的操作流程?
2.有如下的一段程序:
-
a=1;
-
b=a;
-
d=-a;
-
e=a+d;
-
c=2*d;
-
f=b+e-d;
-
g=a*f+c;
为实现这一目标,需将该程序分配至若干台电缆相连的PC设备上进行并行处理。各台PC设备负责处理其中特定的指令序列,并可通过电缆实现与其他设备的数据传输。假设每个PC设备在单位时间内仅能处理一条指令,并且数据传输所需的时间忽略不计,则该程序的整体完成时间至少需要__个单位时间。
三.阅读程序写结果(共 4 题,每题 8 分,共计 32 分)
1.
#include
using namespace std;
int a,b;
int work (int a,int b){
if (a%b)
return work(b,a%b);
return b;
}
int main(){
cin >> a >> b;
cout << work(a,b) << endl;
return 0;
}
输入: 20 12
输出: _______
2.
#include
using namespace std;
int main()
{
int a[3],b[3];
int i,j,tmp;
for (i=0;i<3;i++)
cin >> b[i];
for (i=0;i<3;i++)
{
a[i]=0;
for (j=0;j<=i;j++)
{
a[i]+=b[j];
b[a[i]%3]+=a[j];
}
}
tmp=1;
for (i=0;i<3;i++)
{
a[i]%=10;
b[i]%=10;
tmp*=a[i]+b[i];
}
cout << tmp << endl;
return 0;
}
输入: 2 3 5
输出: _______
3.
#include
using namespace std;
const int c=2009;
int main()
{
int n,p,s,i,j,t;
cin >> n >> p;
s=0;t=1;
for(i=1;i<=n;i++)
{
t=t*p%c;
for(j=1;j<=i;j++)
s=(s+t)%c;
}
cout << s << endl;
return 0;
}
输入: 11 2
输出: __
4.
#include
using namespace std;
const int maxn=50;
void getnext(char str[])
{
int l=strlen(str),i,j,k,temp;
k=l-2;
while(k>=0&&str[k]>str[k+1]) k--;
i=k+1;
while(i<l&&str[i]>str[k]) i++;
temp=str[k];
str[k]=str[i-1];
str[i-1]=temp;
for(i=l-1;i>k;i--)
for(j=k+1;j<i;j++)
if(str[j]>str[j+1])
{
temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
return ;
}
int main()
{
char a[maxn];
int n;
cin >> a >> n;
while(n>0)
{
getnext(a);
n--;
}
cout << a << endl;
return 0;
}
输入: NOIP 3
输出: __
四. 完善程序 ( 前 8 空,每空 3 分,后 2 空,每空 2 分,共 28 分****)****
1.(最大连续子段和) 给出一个数列(元素个数不多于 100), 数列元素均为负整数、
给定一个由非负整数组成的序列,请找出其中的一个连续子序列(Subsequence),使得:
- 在所有可能的满足条件的连续子序列中,
- 其元素之和达到最大值;
- 在上述条件下要求该连续子序列所包含的元素个数尽可能多。
并输出这两个数值:一是最大总和;二是该连续子序列所包含的元素数量。
例如:
当输入序列为4, -5, 3, 2,4时,在满足条件的情况下最大的总和为9,并且对应的最长连续子序列长度为3。
当输入序列为1,2,3,-5,0,7,8时,在满足条件的情况下最大的总和为16,并且对应的最长连续子序列长度为7。
#include
using namespace std;
int a[101];
int n,i,ans,len,tmp,beg;
int main(){
cin >> n;
for (i=1;i<=n;i++)
cin >> a[i];
tmp=0;
ans=0;
len=0;
beg=__① __ ;
for (i=1;i<=n;i++){
if (tmp+a[i]>ans){
ans=tmp+a[i];
len=i-beg;
}
else if (__② __ &&i-beg>len)
len=i-beg;
if (tmp+a[i]__③ __){
beg=__④ __ ;
tmp=0;
}
else
⑤ __ ;
}
cout << ans << " " << len << endl;
return 0;
}
在m×n的棋盘上摆放k个国王,在不导致任何两个国王互相攻击的前提下,请问共有多少种不同的摆放方式?假设某一个国王被放置于坐标为(x,y)的位置,则该国王试图占据该位置时会威胁到以下位置:(x±1, y±1),即其上下左右以及对角线方向的所有相邻格子。
给定一系列坐标点:(x−1, y)、(x−1, y+1)、(x, y−1)、(x, y+1)、(x+1, y−1)、(x+1, y)和(x+1, y+1),随后输入三个整数值n、m和k,并计算并输出结果。本题采用回溯算法进行求解。棋盘的行编号范围是从0到n−₁(即0到n−₁),而列编号范围是从0到m−₁。
#include
using namespace std;
int n,m,k,ans;
int hash[5][5];
void work(int x,int y,int tot){
int i,j;
if (tot==k){
ans++;
return;
}
do{
while (hash[x][y]){
y++;
if (y==m){
x++;
y=__① __ ;
}
if (x==n)
return;
}
for (i=x-1;i<=x+1;i++)
if (i>=0&&i<n)
for (j=y-1;j<=y+1;j++)
if (j>=0&&j<m)
② __ ;
③ __ ;
for (i=x-1;i<=x+1;i++)
if (i>=0&&i<n)
for (j=y-1;j<=y+1;j++)
if (j>=0&&j<m)
④ __ ;
y++;
if (y==m){
x++;
y=0;
}
if (x==n)
return;
}
while (1);
}
int main(){
cin >> n >> m >> k;
ans=0;
memset(hash,0,sizeof(hash));
⑤ __ ;
cout << ans << endl;
return 0;
}
答案部分
NOIP2009 年普及组(C++ 语言)参考答案与评分标准
一、单项选择题:(每题 1.5 分)
-
D 2. B 3. A 4. A 5. B
-
D 7. C 8. B 9. C 10. D
-
C 12. C 13. B 14. D 15. D
-
B 17. D 18. A 19. C 20. B
二、问题求解: (共 2 题, 每空 5 分,共计 10 分)
1.70
2.5
三、阅读程序写结果(共 4 题,每题 8 分,共计 32 分)
-
4
-
416
-
782
-
NPOI
四.完善程序 (前 8 空,每空 3 分,后 2 空,每空 2 分,共 28 分)
注释:以下各程序填空可能还有其他类似的填写方式(各省市可依据实际情况自行填写)
上机验证,不一定上报科学委员会审查)
① 0
② tmp+a[i]==ans 或者 a[i]+tmp==ans 或者 ans==a[i]+tmp 等
③ <0 ④ i
⑤ tmp+=a[i] 或者 tmp=tmp+a[i]
① 0
② hash[i][j]++ 或者 hash[i][j]= hash[i][j]+1 或者 ++hash[i][j]
③ work(x,y,tot+1)
④ hash[i][j]-- 或者 hash[i][j]= hash[i][j]-1 或者 --hash[i][j]
⑤ work(0,0,0)
注意: ② ④ 两空,不一定要++ 或者 - -。也可以是④ - - , ② ++.
除了将变量增加k之外, 还可以减去k; 另外, 任何附加符号的操作(例如位运算)都可以执行. 只要这些操作能够相互抵消, 则此类操作的可能性就非常大.
