08普及组复赛+解题报告
- 格式:pdf
- 大小:219.03 KB
- 文档页数:18
2001第七届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题普及组题一数的计算(20分) 程序名:a01.pas/c/c++问题描述我们要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.样例: 输入: 6 输入文件名:input1.txt满足条件的数为 6 (此部分不必输出) 输出文件名:output1.txt6162612636136问题描述输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数条件: 1.P,A是正整数2.要求P,Q以x0为最大公约数,以y0为最小公倍数.试求:满足条件的所有可能的两个正整数的个数.样例输入:x0=3 yo=60 输入文件名:input2.txt输出:4 输出文件名:output2.txt说明(不用输出)此时的P Q 分别为:3 6015 1212 1560 3所以:满足条件的所有可能的两个正整数的个数共4种.分析:1.数学方法枚举:根据数学性质枚举出所有可能,缺点存储量大,复杂度高p:=a*x0 ; q:=b*x0 (a,b互质)x0为其最大公约数p*q=a*x0*b*x0=y0*x0 y0为p,q最小公倍数则y0=a*b*x02.数学方法:p:=a*x0 ; q:=b*x0 (a,b互质)x0为其最大公约数p*q=a*x0*b*x0=y0*x0 y0为p,q最小公倍数则y0=a*b*x0题三求先序排列(30分)程序名:c03.pas/c/c++问题描述给出一棵二叉树的中序与后序排列。
求出它的先序排列。
(约定树结点用不同的大写字母表示,长度<=8)。
NOIP1995年复赛试题1. 设有下列的算式:求出□中的数字,并打印出完整的算式来。
8 0 9 ------------- □□) □□□□ □□------------- □□□ □□□ ------------- 12. 方阵填数:在一个N ⨯N 的方阵中,填入1,2,……N ⨯N 个数,并要求构成如下的格式: 例:3. 若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为A 类数,否则就称其为B 类数。
例如:(13)10=(1101)2 其中1的个数为3,0的个数为1,则称此数为A 类数; (10)10=(1010)2 其中1的个数为2,0的个数也为2,称此数为B 类数; (24)10=(11000)2 其中1的个数为2,0的个数为3,则称此数为B 类数; 程序要求:求出1~1000之中(包括1与1000),全部A 、B 两类数的个数。
4.编码问题:设有一个数组A:ARRAY[0..N-1] OF INTEGER ;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i ≠j 时)。
例如: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 中的原数据。
5. 灯的排列问题:设在一排上有N 个格子(N ≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N 1,N 2,……N k (k 表示不同颜色灯的个数)。
放灯时要遵守下列规则:同一种颜色的灯不能分开;不同颜色的灯之间至少要有一个空位置。
例如:N=8(格子数) R=2(红灯数) B=3(蓝灯数) 放置的方法有:N=513 14 15 16 1 12 23 24 17 2 11 22 25 18 3 10 21 20 19 4 9 8 7 6 5N=616 17 18 19 20 1 153****221214 29 36 33 22 3 132****423412 27 26 25 24 5 11 10 9 8 7 6B-R 顺序放置的总数为12种。
NOIP2008模拟试题1(4P24)普及组1.报数(read.pas/c/cpp) OIP2010模拟试题4(4P36)[题目描述]CG同学又弄到一批新牛,新牛到了农场以后,首先要学习汉语,数的朗读成为新牛的一个难题,朗读绝对值小于10亿的数。
新牛们知道汉语中有如下的读数规则:1.首先读符号位,然后读整数部分,整数部分之后可能出现小数点,如果有小数部分则小数点一定出现,并且读出小数点之后读小数部分。
2.符号位的读法是:⑴正数,不论正号”+”是否出现,都不必读出符号位;⑵负数的最左边的符号是”-“,读成”负”(以“F”来表示“负”)。
3.整数部分的读法是:⑴如果整数部分不存在或者整数部分全是零则直接读成“零”(以“0”来表示“零”);⑵否则从整数部分中最左边的非零数字开始读起,然后以十、百、千、万、亿(分别以”S”、”B”、”Q”、”W”、“Y”来表示)等数量单位来拼读整数部分。
4.整数部分中:⑴每一个非零数字都必须结合各个相应的数量单位读出来;⑵每一段连续的“零”只能读成一个“零”,但是某一段连续的“零”的左侧或者右侧不存在非零数字(这里只考虑整数部分)则这一段“零”不应该读出来;5.如果有小数部分,则首先读“点”(以“D”来表示“点”),然后从左至右有顺序地读出各个小数位。
在读小数部分的时候不可以使用十、百、千、万、亿等数量单位;但是小数部分的每一个数字都需要读出来,连续的零不可以读成一个“零”,而应该分别读出。
6.如果数中有小数点而没有小数部分,则不应该把小数点读出来。
例如:-0020030004.567应该读成”F2Q03W04D567”,000.89应该读成”0D89”。
请你编写程序帮助新牛把给定的数正确地读出来。
[输入数据]输入文件仅一行,存放了一个数(不超过50字符),其绝对值小于10亿.[输出数据]输出文件仅一行,输出这个数的正确读法。
[样例输入]-0020030004.567[样例输出]F2Q03W04D567program cz;varst,s,t:string;p,i:integer;beginassign(input,'read.in');reset(input);assign(output,'read.out');rewrite(output);readln(st);if st[1]='-' then begindelete(st,1,1);i:=1;while (i<length(st)) do beginif (st[i]<>'0') then beginwrite('F');break;end;inc(i);end;end;p:=pos('.',st);if (p=0) then p:=length(st);i:=1;while (st[i]='0') and (i+1<p) doinc(i);delete(st,1,i-1);p:=pos('.',st)-1;if (p=-1) then p:=length(st);s:='';i:=(p-1) mod 4+1;while (i>0) and (i<=p) do begint:='';if (i>3) thenif (st[i-3]>'0') thent:=t+st[i-3]+'Q'else if (s<>'') and (s[length(s)]<>'0') thent:=t+'0';if (i>2) thenif (st[i-2]>'0') thent:=t+st[i-2]+'B'else if (t<>'') and (t[length(t)]<>'0') thent:=t+'0';if (i>1) thenif (st[i-1]>'0') thent:=t+st[i-1]+'S'else if (t<>'')and(t[length(t)]<>'0') thent:=t+'0';if (i>0) thenif (st[i]>'0') then t:=t+st[i]+'';if (t[length(t)]='0') then delete(t,length(t),1); if (t<>'') then begins:=s+t;case (p-i) div 4 of1:s:=s+'W';2:s:=s+'Y';end;end;inc(i,4);end;if (s='') then s:='0';write(s);if (pos('.',st)>0)and(length(st)>pos('.',st)) thenwrite('D',copy(st,p+2,length(st)-p-1));writeln;close(input);close(output);end.2.背单词(words)源程序名:words.pas/c/cpp输入文件名:word.in输出文件名:word.out时限:1秒问题描述:英语四级考试临近了,小Y却发现他已经把以前学的单词几乎忘光了。
一、新龟兔赛跑(文件名xgtsp.pas)新龟兔赛跑比赛即将举行,此次龟兔赛跑比赛的规则与以往有所不同,不再考察兔子和乌龟谁在最短的时间内跑完规定的路程,而是考察谁在规定时间内跑的路程更长,且兔子和乌龟跑步都是匀速的。
由于兔子的坏习惯,它总喜欢把比赛的总时间T小时中的K小时拿来睡觉。
现在给你比赛的总时间T、兔子的睡觉时间K、兔子的速度U、乌龟的速度V,需要你求出该次比赛谁最后获胜。
输入第一行为一个整数X,表示有X组输入数据。
每组数据只有一行,包括4个数T、K、U、V (1 ≤ T≤ 300,0 ≤ K ≤ T,1 ≤ U ≤ 100,1 ≤ V ≤ 100)。
对于每组数据,输出只有一个数,如果兔子获胜则输出-1,如果乌龟获胜则输出1,如果同时到达则输出0。
允许输入一组数后立即输出对应的结果。
样例输入:21 12 16 2 6 3样例输出:1-1varv,u,t,k,n,i:integer;beginreadln(n);for i:=1 to n do beginreadln(t,k,u,v);if v*t>U*(t-k) then writeln(1);if v*t<U*(t-k) then writeln(-1);if v*t=U*(t-k) then writeln(0);end;end.1、输入:26 2 6 28 6 8 2输出:-12、输入:2300 280 60 20120 0 12 13输出:113、输入:3100 20 50 30100 50 45 25100 80 27 17输出:-1114、输入:3150 77 29 23127 11 22 13139 22 13 7输出:1-1-1二、小球路程(文件名:XQLC.PAS )已知小球从100米高度自由下落,落地后反弹起,又落地,又弹起,……。
每次弹起的高度都是上一次高度的一半。
求小球第N次反弹起的高度和球在整个过程所经过的路程(包括下落和反弹),用键盘输入N,输出反弹高度和经过路程,结果保留两位小数。
N O I P 2 0 1 5 普及组解题报告南京师范大学附属中学树人学校CT1. 金币(coin.cpp/c/pas)【问题描述】国王将金币作为工资,发放给忠诚的骑士。
第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币;这种工资发放模式会一直这样延续下去:当连续N天每天收到N 枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
【输入格式】输入文件名为coin.in 。
输入文件只有1行,包含一个正整数K,表示发放金币的天数。
【输出格式】输出文件名为coin.out 。
输出文件只有 1 行,包含一个正整数,即骑士收到的金币数。
【数据说明】对于100%的数据,1< K< 10,000。
【思路】模拟【时空复杂度】O(k) ,O(1)2 、扫雷游戏(mine.cpp/c/pas )【问题描述】扫雷游戏是一款十分经典的单机小游戏。
在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。
游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
【输入格式】输入文件名为mine.in 。
输入文件第一行是用一个空格隔开的两个整数n和m分别表示雷区的行数和列数。
接下来n行,每行m个字符,描述了雷区中的地雷分布情况。
字符’* '表示相应格子是地雷格,字符''表示相应格子是非地雷格。
相邻字符之间无分隔符。
【输出格式】输出文件名为mine.out 。
noip2009复赛普及组解题报告多项式输出问题转述:给出一个一元多项式各项的次数和系数,按照规定的格式要求输出该多项式。
分析:普及组的水题。
多项式大家应该很熟悉,输出的时候注意一下几点即可:1. 最高次项为正的话开头无加号。
2. 系数为0不输出。
3. 一次项输出x,并非x^1。
4. 非常数项系数为1或-1时直接输出正负号,但是常数项需要输出该数字。
其中除第三项外其它均可在样例中检查出错误,但是若没想到第三点那么就只能得到50分了。
程序:var i,k,n:longint;beginassign(input,'poly.in');reset(input);assign(output,'poly.out');rewrite(output);readln(n);for i:=n downto 0 dobeginread(k);if k=0 then continue;if (k>0) and (i<>n) then write('+');if i=0 then write(k)else if (abs(k)<>1) then write(k) else if k=-1 then write('-');if i<>0 thenif i=1 then write('x')else write('x^',i);end;writeln;close(input);close(output);end.---------------------------------------------------------------------分数线划定问题转述:给出录取人数及所有面试者成绩,考号。
求出分数线和实际录取人数,并按成绩降序,若成绩相同则考号升序的规则输出录取人考号与成绩。
全国信息学奥林匹克联赛(NOIP2010)复赛_普及组_解题报告(pascal)全国信息学奥林匹克联赛(NOIP2010)复赛普及组解题报告1.数字统计(two.pas/c/cpp)【问题描述】请统计某个给定范围[L, R]的所有整数中,数字2 出现的次数。
比如给定范围[2, 22],数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6次。
【算法思路】枚举法,依次将L至R转化为字符串,查找当中有多少个”2”.【程序代码】program two;varl,r:1..10000;i,j,h,c:longint;s:string;beginassign(input,'two.in');assign(output,'two.out');reset(input);rewrite(output);readln(l,r);c:=0;for i:=l to r dobeginstr(i,s);h:=length(s);for j:=1 to h doif s[j]='2'then c:=c+1;end;writeln(c);close(input);close(output);end.2.接水问题(water.pas/c/cpp)【问题描述】学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。
现在有n 名同学准备接水,他们的初始接水顺序已经确定。
将这些同学按接水顺序从1到n 编号,i号同学的接水量为w i。
接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙头接水。
当其中某名同学j 完成其接水量要求w j 后,下一名排队等候接水的同学k马上接替j 同学的位置开始接水。
这个换人的过程是瞬间完成的,且没有任何水的浪费。
noip普及组复赛答案【篇一:noip普及组复赛入门测试(答案+测试数据)】class=txt>新龟兔赛跑比赛即将举行,此次龟兔赛跑比赛的规则与以往有所不同,不再考察兔子和乌龟谁在最短的时间内跑完规定的路程,而是考察谁在规定时间内跑的路程更长,且兔子和乌龟跑步都是匀速的。
由于兔子的坏习惯,它总喜欢把比赛的总时间t小时中的k小时拿来睡觉。
现在给你比赛的总时间t、兔子的睡觉时间k、兔子的速度u、乌龟的速度v,需要你求出该次比赛谁最后获胜。
输入第一行为一个整数x,表示有x组输入数据。
每组数据只有一行,包括4个数t、k、u、v (1 ≤ t≤ 300,0 ≤ k ≤ t,1 ≤ u ≤ 100,1 ≤ v ≤ 100)。
对于每组数据,输出只有一个数,如果兔子获胜则输出-1,如果乌龟获胜则输出1,如果同时到达则输出0。
允许输入一组数后立即输出对应的结果。
样例输入:21 12 16 2 6 3样例输出:1-1varv,u,t,k,n,i:integer;beginreadln(n);for i:=1 to n do beginreadln(t,k,u,v);if v*tu*(t-k) then writeln(1);if v*tu*(t-k) then writeln(-1);if v*t=u*(t-k) then writeln(0);end;end.1、输入:26 2 6 28 6 8 2输出:-12、输入:2300 280 60 20120 0 12 13输出:113、输入:3100 20 50 30100 50 45 25100 80 27 17输出:-1114、输入:3150 77 29 23127 11 22 13139 22 13 7输出:1-1-1二、小球路程(文件名:xqlc.pas )已知小球从100米高度自由下落,落地后反弹起,又落地,又弹起,??。
每次弹起的高度都是上一次高度的一半。
NOIP2009普及组复赛解题报告NFLS QMD第一题多项式输出1、摘要时间复杂度:O(n)空间复杂度:O(n)2、题目大意输入一个n次多项式各项的系数,按要求输出多项式3、算法分析先将不为0的系数和对应的次数存入a数组和b数组,然后依次输出。
要注意以下几点:①系数绝对值为1的情况②指数为1或0的情况③首项加号不必输出4、参考程序program poly;varn,i,g,xx:integer;a,b:array[0..200]of integer;function x(n:integer):string; //处理项的x^n部分varst1:string;beginif n=0 then x:='';if n=1 then x:='x';if n>1 thenbeginstr(n,st1);x:='x^'+st1;end;end;procedure flag(t:integer); //处理每项的符号beginif t>0 then write('+')else write('-');end;beginassign(input,'poly.in');reset(input);assign(output,'poly.out');rewrite(output);readln(n);g:=0;for i:=n downto 0 do //保存系数非零的项beginread(xx);if xx<>0 thenbeging:=g+1;a[g]:=xx;b[g]:=i;end;end;for i:=1 to g dobeginif i=1 then //处理首项的情况beginif abs(a[1])>1 then write(a[1]);if a[1]=-1 then write('-');endelsebeginflag(a[i]);if(b[i]=0)or(abs(a[i])<>1)then write(abs(a[i])); end;write(x(b[i]));end;writeln;close(input);close(output);end.第二题分数线划定1、摘要核心算法思想:排序时间复杂度:O(Nlog2N)空间复杂度:O(N)2、题目大意给出n个分数和编号(编号互不相同),按分数从大到小取前[m*150%]个(可能有重分情况),输出实际数目,最低分数以及按顺序排列的分数、编号。
全国信息学奥林匹克联赛(NOIP2008)复赛普及组注意事项:1、文件名(程序名和输入输出文件名)必须使用小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。
各省在自测时可根据具体配置调整时限。
1.ISBN号码(isbn.pas/c/cpp)【问题描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:首位数字乘以1加上次位数字乘以2......以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2, (9)再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
【输入】输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
【输出】输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
NOIP普及组解题报告————————————————————————————————作者:————————————————————————————————日期:NOIP2014普及组复赛解题报告本人是潍坊一中的wyw,69级,今年高一,现在马上就要NOIP了,打算把历年的NOIP普及、提高组题目都做一下,然后写写解题报告∵这个报告主要是给初中同学看的,所以我会写的详细一点Prolem 1 珠心算测试(count)这道题其实很简单,意思就是说给你一些数a1,a2,a3,a4...a n,然后让你回答有多少个A+B=C(A ≠ B ≠ C)满足(回答C的数量,而不是等式的数量)方法一那么有一种很明显的做法就是三层循环枚举C、A、B,注意:C是在最外层,若找到了一个A和一个B,满足上述等式,则C是一个符合要求的解,这时ans++,并且退出当前枚举,枚举下一个C,这种算法的时间复杂度是O(N3)而我当时没想到这个算法,因为有更好用而且简单更不容易出错的解法,方法二两重循环,分别枚举i=1...n,j=i+1...n,如果ai+aj这个数在集合中存在,那么you[a i+a j]←true,然后再从a1到a n做一次扫描,只要you[a i],ans++这个算法的好处在于它很好写,不用退出什么的,也不用注意循环的顺序,而且时间复杂度是O(N2)代码(方法2):#include<cstdio>using namespace std;int n, a[101], i, j, count;bool you[20001]={false};int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<n;i++)for(j=i+1;j<=n;j++)you[ a[i]+a[j] ]=true;count=0;for(i=1;i<=n;i++)count += you[ a[i] ];printf("%d\n",count);return 0;}在此征求一下大神的意见,如有更快的做法,敬请奉上小结:这道题很简单,但很多人没有做对的原因就是没有好好理解题意,但是根本原因其实还在于心态太骄傲了,认为是第一题就可以轻视,这样是不好的,水题我们更要做好啊,你想想同样是100分,这100分多么好拿,所以是水题、越该放平心态,细心地做。
NOIP 2008普及组解题报告一、ISBN号码(isbn.pas/c/cpp)【问题描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
【输入】输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
【输出】输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
【输入输出样例1】isbn.in0-670-82162-4isbn.outRight【输入输出样例2】isbn.in0-670-82162-0isbn.out0-670-82162-4【试题分析】基础字符串处理题,心细一点的基本都能得满分。
【参考程序】program isbn;constinp='isbn.in';oup='isbn.out';vari,j,k,ans:longint;s:string;ch:char;procedure flink;beginassign(input,inp);reset(input);assign(output,oup);rewrite(output);end;procedure fclose;beginclose(input);close(output);end;beginflink;readln(s);// 输入字符串j:=0;i:=1;ans:=0;while j<9 dobeginif s[i] in ['0'..'9'] then//如果是数字,那么累加到ans中,共9个数字begininc(j);inc(ans,(ord(s[i])-ord('0'))*j);end;inc(i);end;ans:=ans mod 11;计算识别码if ans=10 then ch:='X' else ch:=chr(ord('0')+ans);//把识别码转换成字符,方便输出 if s[length(s)]=chthen write('Right')else write(copy(s,1,12)+ch);//输出正确的识别码fclose;end.二、排座椅(seat.pas/c/cpp)【问题描述】上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。
NOIP2021普及组复赛试题与解题报告noip2021普及组解题报告一、国际标准书号(ISBN.PAS/C/CPP)【问题描述】每本正式出版的书都有一个对应的ISBN号。
ISBN代码包括9位数字、1位识别码和3位分隔符。
其指定的格式类似于“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码。
例如,0-670-82162-4是标准ISBN代码。
ISBN编码的第一位表示该书的出版语言,例如,0表示英语;第一个分隔符“-”后的三位数字代表出版社,例如670代表维京出版社;第二个分隔后的五位数字代表出版社的书号;最后一位是识别码。
识别码的计算方法如下:将第一个数字乘以1,最后一个数字乘以2。
等等结果是mod11,剩下的是识别码。
如果余数为10,则标识码为大写字母X。
例如,ISBN编号0-670-82162-4中的标识码4是通过将九个编号067082162从左到右乘以1,2,。
,9,然后求和,即0×1+6×2+…+2×9=158,然后取158mod11的结果4作为识别码。
你的任务是编写程序判断输入的isbn号码中识别码是否正确,如果正确,则仅输出“right”;如果错误,则输出你认为是正确的isbn号码。
【输入】输入文件ISBN In只有一行,是一个字符序列,代表一本书的ISBN号(确保输入符合ISBN号的格式要求)。
[输出]输出文件isbn.out共一行,假如输入的isbn号码的识别码正确,那么输出“right”,否则,按照规定的格式,输出正确的isbn号码(包括分隔符“-”)。
[输入/输出示例1]ISBN in0-670-82162-4isbn.outright[input/output example 2]中的ISBN0-670-82162-0isbn。
out0-670-82162-4【试题分析】对于基本的字符串处理问题,那些更加小心的人可以得到满分。
NOIP2008南海区普及组复赛模拟测试题㈠(测试时间:2008年11月1日上午)注意事项:1.严格按照题目要求的格式进行输入、输出,否则严重影响得分。
2.题目测试数据有严格时间限制,超时不得分。
3.输入文件格式不用判错;输入输出文件名均已给定,不用键盘输入。
4.程序完成后,要按指定的提交文件名编译成EXE文件,评卷时以EXE文件为准。
5.选手要同时将EXE文件和源程序(PAS)提交。
6.全卷400分,三小时完成。
第一题奶牛式乘法输入文件: cowmul.in输出文件: cowmul.out问题描述:做厌了乘法计算题的贝茜,自创了一种新的乘法运算法则。
在这套法则里,A*B等于一个取自A、一个取自B的所有数字对的乘积的和。
比方说,123*45等于1*4 + 1*5 + 2*4 + 2*5 + 3*4 + 3*5 = 54。
对于2个给定的数A、B(1 < = A, B < = 1,000,000,000),你的任务是,用新的乘法法则计算A*B 的值。
输入格式:输入文件只有一行,是2个用空格隔开的整数:A、B输出格式:输出文件共一行,输出1个整数,即新的乘法法则下A*B的值输入样例(cowmul.in):123 45输出样例(cowmul.out):54第二题晚餐队列安排输入文件: dining.in输出文件: dining.out问题描述:为了避免餐厅过分拥挤,FJ要求奶牛们分2批就餐。
每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第2批就餐的奶牛排在队尾,队伍的前半部分则由设定为第1批就餐的奶牛占据。
由于奶牛们不理解FJ的安排,晚饭前的排队成了一个大麻烦。
第i头奶牛有一张标明她用餐批次D_i(1 < = D_i < = 2)的卡片。
虽然所有N(1 < = N < = 30,000)头奶牛排成了很整齐的队伍,但谁都看得出来,卡片上的号码是完全杂乱无章的。
第一题:筛选法求素数。
var a:array[1..50000]of boolean;x,y,i,j,n:longint;beginassign(input,'prime.in'); reset(input);assign(output,'prime.ans'); rewrite(output);readln(n);fillchar(a,sizeof(a),true);for i:=2 to trunc(sqrt(50000)) doif a[i] thenfor j:=2 to 50000 div i doa[i*j]:=false;for i:=2 to 50000 doif a[i] and (n mod i=0) thenbegin writeln(n div i); break; end;close(input); close(output);end.第二题:模拟法,因为指示牌上的数字较大,可先统计每层有楼梯的个数,再取余。
var a,b:array[0..10000,0..100]of longint; x,y,i,j,k,n,m,s,t,w:longint;c:array[1..10000]of integer;begin{ assign(input,'c:\1.in'); reset(input);}assign(input,'treasure.in'); reset(input);assign(output,'treasure.ans'); rewrite(output);readln(n,m);for i:=1 to n do begins:=0;for j:=0 to m-1 do beginreadln(a[i,j],b[i,j]);if a[i,j]=1 then s:=s+1;end;c[i]:=s;end;readln(x); s:=0;for i:=1 to n do beginy:=x; s:=(s+b[i,x])mod 20123; t:=b[i,x]mod c[i]+c[i];repeatif a[i,y]=1 then t:=t-1;if t=0 then break;y:=y+1;if y=m then y:=0;until false;x:=y;end;writeln(s); close(input); close(output);end.第三题:动态规划F[I,J] 表示用I种花摆J盆共有和摆法,则F[I,J]=(∑F[I-1,J] ),(注意只取J-I的盆数~J盆求和)var a:array[0..100,0..100]of longint;i,j,k,m,n,s,t:longint; w:array[0..100]of longint;beginassign(input,'flower.in'); reset(input);assign(output,'flower.ans'); rewrite(output);readln(n,m);for i:=1 to n do read(w[i]);for i:=1 to w[1] do a[1,i]:=1;for i:=0 to m do a[i,0]:=1;for i:=2 to m do beginfor j:=1 to m do begins:=0;for k:=j-w[i] to j doif k>=0 then s:=(s+a[i-1,k])mod 1000007;a[i,j]:=s;end;end;writeln(a[m,m]);close(input); close(output);end.4、搜索,可是第10个数据过不了,要输出“-1”,不知道哪里BUG了,不想了。