NOIP2008提高组复赛题解
NOIP2008信息奥赛提高组试题与答案

NOIP2008信息奥赛提高组试题与答案(Pascal语言)第14届信息学奥赛试题单项选择1. 在以下各项中,()不是操作系统软件。
A.Solaris B.Linux C.Sybase D.Windows Vista E.Symbian2. 微型计算机中,控制器的基本功能是()。
A. 控制机器的各个部件协调工作B.实现算数运算与逻辑运算C.存储各种控制信息D. 获取外部信息E.存放程序和数据3. 设字符串S=“Olympic”,S的非空字串的数目是()。
A.29B.28C.16D.17E.74. 完全2叉树有2*N-1的结点,则它的叶子结点数目是()。
A.N-1B.2*NC.ND.2^N-1E.N/25. 将数组{8,23,4,16,77,-5,53,100}中元素从大到小按顺序排序,每次可以交换任意两个元素,最少要交换()次。
A.4B.5C.6D.7E.86.设栈S的初始状态为空,元素a,b,c,d,e,f依次入栈,出栈顺序为b,d,c,f,e,a那么栈容量至少该是()A.6B.5C.4D.3E.27.与十进制数28.5625相等的四进制数是()A.123.21B.131.22C.130.22D.130.21E.130.208.递归过程和函数调用时,处理参数和返回地址,通常使用一种称为()的数据结构。
A.队列B.多维数组C.线性表D.链表E.栈9.TCP/IP 是一组构成互联网基础的网络协议,字面上包括两组协议:传输控制协议(TCP)和网际互联协议(IP)。
TCP/IP协议把Internet网络系统描述成具有4个层次功能的网络模型,其中提供源节点和目的节点之间的信息传输服务,包括寻址和路由器选择等功能的是()。
A.链路层B.网络层C.传输层D.应用层E.会话层10.对有序数组{5,13,19,21,37,56,64,75,88,92,100}进行二分查找,等概率情况下,查找成功的平均查找长度(平均比较次数)是()。
NOIP2008提高组复赛试题-推荐下载

测试点数目
10
每个测试点分值 10
比较方式
全文比较
matches matches matches.in matches.out 1秒 10 10 全文比较
message message message.in message.out 1秒 10 10 全文比较
twostack twostack twostack.in twostack.out 1秒 10 10 全文比较
message.in
33 039
34 285 570 【限制】
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
1995-2008 历届NOIP试题及详解

例如:N=6 时,有:
A=(4,3,0,5,1,2)
此时,数组 A 的编码定义如下:
A[0]的编码为 0;
A[i]的编码为:在 A[0],A[1],…,A[i-1]中比 A[i]的值小的个数(i=1,2,…,N-1)
∴ 上面数组 A 的编码为: B=(0,0,0,3,1,2)
程序要求解决以下问题:
③ 给出数组 A 后,求出其编码。 ④ 给出数组 A 的编码后,求出 A 中的原数据。 <2> 灯的排列问题: 设在一排上有 N 个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为 N1,N2,……Nk(k 表示不同颜色灯的个数)。 放灯时要遵守下列规则:
b 输入:N=10 B=(0,1,2,3,4,5,6,7,8,9)
输出编码: A=(0,1,2,3,4,5,6,7,8,9)
c 输入:N=7 B=(0,0,0,0,4,5,6)
输出编码: A=(3,2,1,0,4,5,6)
<7> 本题共 30 分(10%+10%+10%)
④ 数据输入: N=6
P1=R
Y
RRR
BB
Y
RRR
BB
Y
RRR
BB
Y
RRR
BB
Y
RRR
BB
Y
RRR
BB
Y
RRR
BB
Y
NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛
分区联赛复赛试题(高中组)
(上机编程,完成时间:210 分钟)
<1> 编码问题:
设有一个数组 A:ARRAY[0..N-1] OF INTEGER;
数组中存放的元素为 0~N-1 之间的整数,且 A[i]≠A[j](当 i≠j 时)。
NOIP2008提高组复赛题解-文档资料

思路: 枚举两加数,计算所需火柴棒是否等于n。枚举 范围0~1000。 总结: 这也是比较水的一道题,数据规模较小,算法 简单,比赛中clude <fstream> #define I_F "matches.in" #define O_F "matches.out" #define MAX 1000 using namespace std; const short match[10]={6,2,5,5,4,5, 6,3,7,6}; //10个数字所需火柴棒
思路:
统计单词中每个字母的出现次数,挑出最多的次数和 最少的次数(不包括0次),相减判断是否为质数即可。 判断质数时可以写函数判断,也可以把100以内的质数 列成常量数组直接判断,因为单词最多只有100个字母。 需要注意的是输出时的LWNA四个字母要大写。 * 总结: 这是一道送分题,没有什么难度,需要注意的细节也 不多,所以在比赛中是一定要拿满分的。
long ans; short n;
void Input(); int Matches(int x); void Search(); void Output(); int main() { Input(); Search(); Output(); } void Input() { ifstream fin(I_F); fin>>n; fin.close(); }
输入格式: 输入文件matches.in共一行,有一个整数n(n<=24)。 * 输出格式: 输出文件matches.out共一行,表示能拼成的不同等 式的数目。
样例1 输入:
14 输出: 2 解释: 2个等式为0+1=1和1+0=1。
1995-2008 历届NOIP试题及详解

N=6
正整数化为二进制数,在此二进制数中,我们将数字 16 17 18 19 20 1
1
于数字
0
的个数的这类二进制数称为 15 30 31 32 21 2
A
类数,否则就称
数。
14 29 36 33 22 3
(13)10=1(3 1218013)5 234 23 4
的个数为132,207 的26个2数5 为241,5则称此数为 A 类数;
提示:文档已分节,可用 word 跳转节功能 本文为本人将 1995-2008 年历届 NOIP 试题、研究成果整理而成,由于“年代久远”所以有不少 资料没有找到。但本人都尽量整理最有价值的信息记录于此。 资料来源皆为网络,若引用请注明出处 一不注意就 208 页了呢~ 其实最初只是想方便自己,看着一下午的成果,就忍不住放到了网络 上。由于赶时间,质量不太好,而且历届 NOIP 的排版也不一样,只是做了粗略的整理、排 版,若有错误之处,敬请谅解。 回首历届 NOIP,甚至比我自己出生的还早的老题,一代代 OIer 就从这条路上走过,作为一个 不大努力的 OIer,我甚至为自己感到愧疚。总之,为了报答一代代出题人、教师、主办方以及 OIer 们,在努力一把也不迟啊。
96
109
108
1 <2> 本题 18 分(4%+6%+8%)
① 输入 N=1 (4%) 结果:
② 输入 N=3 (6%) 结果:
1
781
692
543 ③ 输入 N=10(8%)
结果: 28 29 30 31 32 33 34 35 36 1
27 58 59 60 61 62 63 64 37 2
26 57 80 81 82 83 84 65 38 3
NOIP2008提高组复赛模拟试题

全国青少年信息学奥林匹克联赛复赛模拟试题湖南省长沙市第一中学周祖松1.无限序列(infinit.pas/c/cpp)【问题描述】我们按以下方式产生序列:1、开始时序列是: "1" ;2、每一次变化把序列中的 "1" 变成 "10" ,"0" 变成 "1"。
经过无限次变化,我们得到序列"1011010110110101101..."。
总共有 Q 个询问,每次询问为:在区间A和B之间有多少个1。
任务写一个程序回答Q个询问输入第一行为一个整数Q,后面有Q行,每行两个数用空格隔开的整数a, b。
输出共Q行,每行一个回答约定∙ 1 <= Q <= 5000∙ 1 <= a <= b < 263样例分析:我们先看看序列变化规律,S1 = "1", S2 = "10", S3 = "101", S4 = "10110", S5 = "10110101", 等等. Si 是 S(i+1)的前缀。
序列Si 是由序列 S(i-1)和 S(i-2), 连接而成的。
即Si = Si-1 + Si-2 (实际上上是Fibonacci数列)。
找到规律以后,我们可以可以用递归的方法求出从从位置1到位置X之间所有的1的个数,用一个函数F计算,结果为f(b)-f(a-1)。
时间复杂度为: O(Q * log MAX_VAL)此题需要先找出数学规律,再进用递归实现。
主要考查选手的数学思维能力和递归程序的实现。
源程序:constnn=92; //进行92次的数列扩展后,数列长度就会超过给定的数据范围,varf,ft:array[0..nn] of int64;q,i,j,l1,l2:longint;a,b:qword;procedure prapre;{预处理}var i:longint;beginf[0]:=1;f[1]:=1;ft[0]:=0;ft[1]:=1;for i:=2 to nn dobeginf[i]:=f[i-1]+f[i-2];ft[i]:=ft[i-1]+ft[i-2];end;end;function find(a:int64;ll:longint):int64;{求这个数列的前a个有多少个1}beginif a=0 then exit(0);find:=0;if a=f[ll] then find:=ft[ll] elseif a<=f[ll-1] then find:=find(a,ll-1)else find:=ft[ll-1]+find(a-f[ll-1],ll-2);end;beginassign(input,'infinit.in');reset(input);assign(output,'infinit.out');rewrite(output);prapre;readln(q);for i:=1 to q dobeginreadln(a,b);writeln(find(b,nn)-find(a-1,nn));end;close(input);close(output);end.2.删数(remove.pas/c/cpp)【问题描述】有N个不同的正整数数x1, x2, ... x N排成一排,我们可以从左边或右边去掉连续的i个数(只能从两边删除数),1<=i<=n,剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。
【精选资料】NOIP提高组复赛试题与简解转载

Day1铺地毯【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。
一共有n 张地毯,编号从1 到n。
现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。
注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
【输入】输入文件名为 carpet.in。
输入共 n+2 行。
第一行,一个整数 n,表示总共有n 张地毯。
接下来的 n 行中,第i+1 行表示编号i 的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y 轴方向的长度。
第 n+2 行包含两个正整数x 和y,表示所求的地面的点的坐标(x,y)。
【输出】输出文件名为 carpet.out。
输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。
【输入输出样例 1】【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。
【输入输出样例 2】【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。
【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。
【一句话题意】给定n个按顺序覆盖的矩形,求某个点最上方的矩形编号。
【考察知识点】枚举【思路】好吧我承认看到图片的一瞬间想到过二维树状数组和二维线段树。
置答案ans=-1,按顺序枚举所有矩形,如果点在矩形内则更新ans。
注意题中给出的不是对角坐标,实际上是(a,b)与(a+g,b+k)。
2008年noip提高组复赛题解

2015/11/25
北京12中庄燕文
【题目类型】双线程动态规划 【建议编程时间】40分钟。这里的编程时间包括调试时间。 【空间复杂度】约27M,全局变量完全可承受。50*50*50*50*sizeof(int)=2.5*10^7. 【解题分析】 1、 读入矩阵,注意行列。 2、 采用一个四维数组记录当前两条路走到的位置(i1,j1,i2,j2)时取得的最大值,初始化为 0,表示不可能到达。(0,0,0,0)为1,最后减1输出。 3、 一个四重循环枚举两条路分别走到的位置。由于每个点均从上或左继承而来,故内部 有四个if,分别表示两个点从上上、上左、左上、左左继承来时,加上当前两个点所取得 的最大值。例如,f[i][j][k][l] = max{f[i][j][k][l], f[i-1][j][k-1][l] + a[i][j] + a[k][l]},表示两点均从 上面位置走来。 4、 输出右下角处的最大值f[m][n][m][n],注意换行。 【编程注意】 1、 在数组边界处特殊处理,避免数组越界。 2、 若待继承的点最大值为零,则停止判断,不能从这里走来。 3、 显然,非矩阵右下角的汇合点,两个位置不能重合(否则路径相交),若重合则最大 值为0,不可达。
2015/11/25
北京12中庄燕文
这道题的错误做法很多,错误做法却能得满分的也很多, 这里就不多说了.直接切入正题,就是即将介绍的这个基 于二分图的算法. 注意到并没有说基于二分 图匹配,因为这个算法和二分图匹配无关.这个算法只是 用到了给一个图着色成二分图. 第一步需要解决的问题是,判断是否有解. 考虑对于任意两个数q1[i]和q1[j]来说,它们不能压入同 一个栈中的充要条件是什么(注意没有必要使它们同时 存在于同一个栈中,只是压入了同一个栈).实际上,这个 条件p是:存在一个k,使得i<j<k且q1[k]<q1[i]<q1[j].
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <fstream> #include <string> #include <cmath> #define I_F "word.in" #define O_F "word.out" using namespace std; string s; short ans; void Input(); void Search(); bool Pd(); void Output(); int main() {
+s[i,j]+s[k,l]
f[i,j-1,k-1,l] (j>1)且(k>i+1)
f[I,j-1,k,j-1] (j>1)
同时,由于两条线不能交叉,有k>i。
状态压缩 因为两条路线长度相等,所以有i+j=k+l,则状态
可以压缩为三维,压缩后的转移方程为:
f[i-1,j,k-1] (i>1) f[i,j,k]=min f[i-1,j,k] (i>1) +s[i,j]+s[k,i+j-k]
if (f[i]>0) {
if (f[i]>max) max=f[i];
if (f[i]<min) min=f[i];
} ans=max-min; }
void Output() {
ofstream fout(O_F); if (Pd())
fout<<"Lucky Word\n"<<ans<<endl;
else fout<<"No Answer\n0\n";
fout.close(); }
bool Pd() //判断质数 {
if (ans==1) return false;
else if (ans==2) return true;
else if (ans%2==0) return false;
else for (short i=3; i<=sqrt((dou
else return b;
}
void Dyna() {
short i,j,k; for (i=0; i<n; i++)
for (j=0; j<m; j++) for (k=i+1; k<=i+j; k++) if (k==i+1) //需要格外注意边界条件 if (i==0) f[i][j][k]=f[i][j-1][k]+s[i][j]+s[k][i+j-k]; else if (j==0) f[i][j][k]=max(f[i-1][j][k],f[i-1][j][k-1])+s[i][j]+s[k][i+j-k]; else f[i][j][k]=max(max(f[i-1][j][k],f[i-1][j][k-1]),f[i][j1][k])+s[i][j]+s[k][i+j-k]; else if (i==0) f[i][j][k]=max(f[i][j-1][k-1],f[i][j-1][k])+s[i][j]+s[k][i+j-k]; else if (j==0) f[i][j][k]=max(f[i-1][j][k],f[i-1][j][k-1])+s[i][j]+s[k][i+j-k]; else f[i][j][k]=max(max(f[i-1][j][k],f[i-1][j][k-1]),max(f[i][j1][k-1],f[i][j-1][k]))+s[i][j]+s[k][i+j-k];
if (Matches(i)+Matches(j)+Matches(i+j)==n) {
if (i!=j) ans+=2;
else ans++;
} }
//Output函数略
第三题 传纸条
问题描述: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完
的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的 矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就 无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。 纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐 标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的 纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向 上或者向左传递。
样例1 输入:
error 输出:
Lucky Word 2 解释: 单词error中出现最多的字母r出现了3次,出现 次数最少的字母出现了1次,3-1=2,2是质数。
样例2 输入:
olymipic 输出:
No Answer 0 解释: 单词olympic中出现最多的字母i出现了2次,出现次 数最少的字母出现了1次,2-1=1,1不是质数。
输入格式:
输入文件word.in只有一行,是一个单词,其中只可 能出现小写字母,并且长度小于100。
*输出格式: 输出文件word.out共两行,第一行是一个字符串,
假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”; 第二行是一个整数, 如果输入单词是Lucky Word,输出maxn-minn的值,否则 输出0。
Input(); Search(); Output(); return 0; } void Input() { ifstream fin(I_F); fin>>s; fin.close(); }
参考样程
void Search() //统计字母出现次数 {
short i, max=0, min=200; short f[26]={0}; for (i=0; i<s.length(); f[s[i++]-'a']++); for (i=0; i<26; i++)
输入格式: 输入文件message.in的第一行有2个用空格隔开
的整数m和n,表示班里有m行n列(1<=m,n<=50)。 接下来的m行是一个m*n的矩阵,矩阵中第i行j
列的整数表示坐在第i行j列的学生的好心程度。每行 的n个整数之间用空格隔开。
输出格式: 输出文件message.out共一行,包含一个整数,
思路: 枚举两加数,计算所需火柴棒是否等于n。枚举
范围0~1000。
总结: 这也是比较水的一道题,数据规模较小,算法
简单,比赛中这样的题也应该拿到满分。
#include <fstream> #define I_F "matches.in" #define O_F "matches.out" #define MAX 1000 using namespace std; const short match[10]={6,2,5,5,4,5, 6,3,7,6}; //10个数字所需火柴棒 long ans; short n; void Input(); int Matches(int x); void Search(); void Output(); int main() {
表示来回两条路上参与传递纸条的学生的好心程度 之和的最大值。
样例 输入:
33 039 285 570 输出:
34
数据规模: 30%的数据满足:1<=m,n<=10 100%的数据满足:1<=m,n<=50
思路:
首先想到搜索,但是对于只考虑一条路线来说,
每一步有两种状态 一共要走m+n步,搜索整棵树的 时间复杂度为O(2^(m+n)),如果两条路线都考虑的 话,时间复杂度为O(4^(m+n)),即使是30%的数据, 即m+n=20,4^20≈10^12,这样的数据规模也还是太 大了。
#include <fstream>
#define I_F "message.in" #define O_F "message.out"
using namespace std;
short n,m; short s[60][60]; long f[60][60][60];
void Input(); long max(long a, long b); void Dyna(); void Output();
思路:
统计单词中每个字母的出现次数,挑出最多的次数和 最少的次数(不包括0次),相减判断是否为质数即可。
判断质数时可以写函数判断,也可以把100以内的质数 列成常量数组直接判断,因为单词最多只有100个字母。
需要注意的是输出时的LWNA四个字母要大写。 * 总结:
这是一道送分题,没有什么难度,需要注意的细节也 不多,所以在比赛中是一定要拿满分的。
4维动态规划
本题可以使用动态规划法解决。
设f[i,j,k,l]为第一条线走到(I,j),第二条线走到
(k,l)时的最优值(方便起见,两条线都看作从左上角
开始,右下角结束)。
动态转移方程:
f[i-1,j,k-1,l] (i>1)
f[i,j,k,l]=min f[i-1,j,k,l-1] (i>1)
while (t>0) {
s+=match[t%10]; t/=10; } return s; }
void Search() {
int i,j; n-=4; for (i=0; i<MAX; i++)