08普及组复赛+解题报告
2001-2002年普及复赛试题及分析
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)。
1995-2008复赛试题及解析
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种。
NOIP2013复赛模拟8解题报告
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却发现他已经把以前学的单词几乎忘光了。
noip普及组复赛入门测试(答案+测试数据)
一、新龟兔赛跑(文件名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,输出反弹高度和经过路程,结果保留两位小数。
【免费下载】NOIP普及组解题报告
【输入】 输入文件 group.in 包含 n+2 行: 第 1 行包括一个整数 w,为每组纪念品价格之和的上限。 第 2 行为一个整数 n,表示购来的纪念品的总件数。 第 3~n+2 行每行包含一个正整数 pi(5<=pi<=w),表示所对应纪念品的价格。
字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1~n(恰好是输入数据的行号减 1)。 所给的数据都是正确的,不必检验。
【输出】 输出文件 scholar.out 共有 5 行,每行是两个用空格隔开的正整数,依次表示前 5 名学生的学号
和总分。
【输入输出样例 l】 scholar.in 6 90 67 80 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98
scholar.out 6 265 4 264 3 258 2 244 1 237
【输入输出样例 2】 scholar.in 8 80 89 89 88 98 78 90 67 80 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98
scholar.out 8 265 2 264 6 264 1 258 5 258
s:integer; begin
s:=a; a:=b;
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
NOI普及组复赛解题报告
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复赛普及组解题报告
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)复赛_普及组_解题报告(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普及组复赛答案【篇一: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普及组复赛解题报告
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普及组复赛试题(附题解)
全国信息学奥林匹克联赛(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普及组解题分析报告
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分多么好拿,所以是水题、越该放平心态,细心地做。
NOIP2008普及组复赛试题与解题报告
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普及组复赛试题与解题报告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南海区普及组复赛模拟测试题
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)头奶牛排成了很整齐的队伍,但谁都看得出来,卡片上的号码是完全杂乱无章的。
NOIP2012普及组复赛解题报告
第一题:筛选法求素数。
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了,不想了。
1995-2008 历届NOIP试题及详解
N1=1
Q
排列方案: R
⑤ 排数列据总输数入=:6 N=6 R
P1=R
N1=2 R
P2=Y Q
N2=1 R
R
⑥排数列据方输案入::N=R12 R
Y
R
排列总数=12 P1=RR R N1= 3 Y
P2=RB R N2=2
Y
P3=Y R N3R=1
Y
Q
RR
Y
排列方案:
RR
<8> 本题排共列40总分数(:12%+14%R+14R%) R
BBB
RR
N
P1(颜色,为一个字母) N1(灯的数量)
P2
N2
……
Q(结束标记,Q 本身不是灯的颜色)
程序要求:求出一种顺序的排列方案及排列总数。
<3> 设有一个四层的积木块,1~4 层积木块的数量依次为:5,6,7,8
如下图所示放置:
8 15 8 5 16 9 14
23414326 其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算出
输出: A=(3,2,1,0,4,5,6)
<5> 本题共 30 分(10%+10%+10%)
① 数据输入: N=6
P1=R
N1=1
Q
排列方案: R ② 排数列据总输数入=:6 N=6 R
P1=R
NR1=2
P2=Y
N2=1 R
Q
R
排列方案: R ③ 排数列据总输数入=:12N=1R2
P1=RR
R
Y
R R N1= 3
(10)10=1(1 110010)9 2 8 7 6
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【输入输出样例】
seat.in 45123 4243 2333 2524 【输入输出样例解释】
识别码的计算方法如下: 首位数字乘以 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 号码。
seat.out 2 24
4 3
2 1
1
**
※
※+
+
23
4
5
上图中用符号*、※、+ 标出了 3 对会交头接耳的学生的位置,图中 3 条粗线的 位置表示通道,图示的通道划分方案是唯一的最佳方案。
3.传球游戏
(ball.pas/c/cpp)
【问题描述】 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着
【输入】 输入文件 ball.in 共一行,有两个用空格隔开的整数 n,m(3<=n<=30,1<=
m<=30)。 【输出】
输出文件 ball.out 共一行,有一个整数,表示符合题意的方法数。
【输入输出样例】 ball.in 33
ball.out 2
【限制】 40%的数据满足:3<=n<=30,1<=m<=20 100%的数据满足:3<=n<=30,1<=m<=30
【输入输出样例 1】 isbn.in 0-670-82162-4
isbn.out Right
【输入输出样例 2】 isbn.in 0-670-82162-0
isbn.out 0-670-82162-4
2.排座椅
(seat.pas/c/cpp)
【问题描述】 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分
立体图中,定义位于第(m,1)的格子(即第 m 行第 1 列的格子)上面自底向 上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。
【输入】
输入文件 drawing.in 第一行有用空格隔开的两个整数 m 和 n,表示有 m*n 个 格子(1<=m,n<=50)。
接下来的 m 行,是一个 m*n 的矩阵,每行有 n 个用空格隔开的整数,其中 第 i 行第 j 列上的整数表示第 i 行第 j 列的格子上摞有多少个积木(1<=每个格子 上的积木数<=100)。 【输出】
procedure fclose; begibegin flink; readln(s);// 输入字符串
j:=0; i:=1; ans:=0; while j<9 do
begin if s[i] in ['0'..'9'] then//如果是数字,那么累加到 ans 中,共 9 个
头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确 定下来之后,只有有限的 D 对同学上课时会交头接耳。同学们在教室中坐成了 M 行 N 列,坐在第 i 行第 j 列
的同学的位置是(i,j),为了方便同学们进出,在教室中设置了 K 条横向的通 道,L 条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时 学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因 为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
数字 begin inc(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)]=ch then write('Right') else write(copy(s,1,12)+ch);//输出正确的识别码 fclose; end. 二、排座椅 用的是赛前集训时提到的贪心,当时说某些题目用贪心可以得部分分,但是本题 贪心可以得满分的。 当然本题的贪心需要预处理下,开 2 个一维数组,row[i]录如果在第 i 行加通道, 可以分割多少对调皮学生,col[i]记录如果在第 j 列加通道,可以分割多少对调 皮学生,最后贪心法输出分割学生最多的前 K 行和前 L 列。 参考程序: program seat;
Noip2008 普及组解题报告 一、ISBN 号码
基础字符串处理题,心细一点的基本都能得满分。 参考程序: program isbn; const
inp='isbn.in'; oup='isbn.out';
var i,j,k,ans:longint; s:string; ch:char;
procedure flink; begin assign(input,inp); reset(input); assign(output,oup); rewrite(output); end;
seat.in seat.out
1秒
10 10
全文比较 传统
传球游戏 ball ball
ball.in ball.out
1秒
10 10
全文比较 传统
立体图 drawing drawing drawing.in drawing.out
1秒
10 10
全文比较 传统
二.提交源程序文件名
对于 pascal 语 isbn.pas
【输入】 输入文件 isbn.in 只有一行,是一个字符序列,表示一本书的 ISBN 号码(保
证输入符合 ISBN 号码的格式要求)。
【输出】 输出文件 isbn.out 共一行,假如输入的 ISBN 号码的识别码正确,那么输出
“Right”,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符“-”)。
言
对于 C 语言 gcc –o isbn gcc –o seat
isbn.c
seat.c
对于 C++语言 g++ –o isbn g++ –o seat
isbn.cpp
seat.cpp
fpc ball.pas
gcc –o ball ball.c
g++ –o ball ball.cpp
fpc drawing.p as
+---+
/ /| 高 +---+ | | |+ | |/ 宽 +---+ 长
每个顶点用 1 个加号’+’表示,长用 3 个”-“表示,宽用 1 个”/”表示,高用两 个”|”表示。字符’+’ ‘-‘’/’ ‘|’的 ASCII 码分别为 43,45,47,124。字符’.’(ASC II 码 46)需要作为背景输出,即立体图里的空白部分需要用’.’代替。立体图的画 法如下面的规则:
若两块积木左右相邻,图示为: ..+---+---+ ./ / /| +---+---+ | | | |+ | | |/. +---+---+..
若两块积木上下相邻,图示为: ..+---+ ./ /| +---+ | | |+ | |/| +---+ | | |+ | |/. +---+..
若两块积木前后相邻,图示为: ….+---+ …/ /| ..+---+ | ./ /| + +---+ |/. | | +.. | |/… +---+….
Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相 邻或者左右相邻)。
输入数据保证最优方案的唯一性。
【输出】 输出文件 seat.out 共两行。 第一行包含 K 个整数,a1a2……aK,表示第 a1 行和 a1+1 行之间、第 a2 行和
第 a2+1 行之间、…、第 aK 行和第 aK+1 行之间要开辟通道,其中 ai< ai+1,每两 个整数之间用空格隔开(行尾没有空格)。
全国信息学奥林匹克联赛(NOIP2008)复赛
普及组
一.题目概览 中文题目名称 英文题目名称 可执行文件名 输入文件名 输出文件名 每个测试点时
限 测试点数目 每个测试点分
值 比较方式 题目类型
ISBN 号码 isbn isbn
isbn.in isbn.out
1秒
10 10
全文比较 传统
排座椅 seat seat
gcc –o drawin g
drawing.c g++ –o drawing drawing.cpp
四.运行内存限制
运行内存上限