2014noip复赛模拟练习10(答案)
NOIP2014普级组复赛试题

CCF全国信息学奥林匹克联赛(NOIP2014)复赛普及组(请选手务必仔细阅读本页内容)一.题目概况中文题目名称珠心算测试比例简化螺旋矩阵子矩阵英文题目与子目录名count ratio matrix submatrix 可执行文件名count ratio matrix submatrix 输入文件名count.in ratio.in matrix.in submatrix.in 输出文件名count.out ratio.out matrix.out submatrix.out 每个测试点时限1秒1秒1秒1秒测试点数目10 10 10 20 每个测试点分值10 10 10 5 附加样例文件有有有有结果比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统传统运行内存上限128M 128M 128M 128M二.提交源程序文件名对于C++语言count.cpp ratio.cpp matrix.cpp submatrix.cpp 对于C语言count.c ratio.c matrix.c submatrix.c 对于pascal语言count.pas ratio.pas matrix.pas submatrix.pas三.编译命令(不包含任何优化开关)对于C++语言g++ -o countcount.cpp -lm g++ -o ratioratio.cpp -lmg++ -o matrixmatrix.cpp -lmg++ -o submatrixsubmatrix.cpp -lm对于C语言gcc -o countcount.c -lm gcc -o ratio ratio.c-lmgcc -o matrixmatrix.c -lmgcc -o submatrixsubmatrix.c -lm对于pascal语言fpc count.pas fpc ratio.pas fpc matrix.pas fpc submatrix.pas注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
noip普及组复赛模拟试题10答案

【试题描述】选拔考试即将开始,同学们陆续进入考场,哇,考场好大啊。
究竟star应该坐在哪张位置呢?考场门口贴了一张考场座位(m*n)明细表,其中考场里的有些位置是坏的不能坐,考号为1的同学的座位号是第一排第一列,即他的座位是1、1,2号同学的座位是1、2,以此类推,当然,如果某个座位是坏的,那么这个同学就往后延一个座位,后面的同学再依次排下去。
考场座位肯定够所有考生坐。
【输入描述】第1行:3个整数,m,n,k(m,n表示考场的座位是m行n列,k表示star的考号)m,n<=100;第2..m+1行:每行n个数代表考场明细0代表座位是好的,1代表座位是坏的)【输出描述】一行:两个整数代表star应该坐的位置【输入样例】4 4 50 0 0 00 0 1 00 0 0 10 0 0 0【输出样例】2 1【试题来源】常州长训班测试program ex1661;var k,i,j,s,m,n:integer;a:array[1..100,1..100] of 0..1;beginreadln(m,n,k);for i:=1 to m dofor j:=1 to n doread(a[i,j]);s:=0;for i:=1 to m dofor j:=1 to n dobeginif a[i,j]<>1 then inc(s);if s=k then begin writeln(i,' ',j); exit;end;end;end.输入 6 6 70 0 0 0 1 00 0 1 0 0 00 0 0 1 1 00 0 0 0 0 11 0 0 0 0 00 0 1 0 0 1 输出 2 2输入8 6 100 0 0 0 1 00 0 1 0 0 00 0 0 1 1 00 0 0 0 0 11 0 0 0 0 00 0 1 0 0 10 1 0 0 0 01 0 0 0 0 1输出 2 6【题目描述】一个农夫有n(n≤1000)头奶牛,可由于产奶太少,他决定把当天产奶最少的牛杀掉,但他有点舍不得,如果当天不只一头奶牛产奶,至少他便放过它们。
NOIP2014复赛提高组标准答案

一、单项选择题(共 15 题,每题 1.5 分,共计 22.5 分) 1 2 3 4 B 9 D D 10 A D 11 D B 12 C
5 C 13 C
6 C 14 B
7 B 15 C
8 B
二、不定项选择题(共 5 题,每题 1.5 分,共计 7.5 分;每题有一个或多个正确选项,没有部分分) 1 AB 2 BCD 3 ABCDE 4 AC 5 BD
三、问题求解(共 2 题,每题 5 分,共计 10 分;每题全部答对得 5 分,没有部分分) 1. 2. 102 15
四、阅读程序写结果(共 4 题,每题 8 分,共计 32 分) 1. 2. 8 20
3. 4.ຫໍສະໝຸດ 2 5 6 3 4 7 1 3 6 9 1 5 10 4 11 8 2 7
五、完善程序(共计 28 分,以下各程序填空可能还有一些等价的写法,由各省赛区组织本省专家审定及 上机验证,可以不上报 CCF NOI 科学委员会复核) Pascal 语言 1. (1) (2) (3) (4) (5) 2. (1) (2) (3) (4) [1,1] rowsum[i,0]:=0 rowsum[i,j-1]+matrix[i][j] area:=0 stack2[top2]:=stack1[top1] stack1[top1]:=stack2[top2] top1-1 [1][1] rowsum[i][0]=0 rowsum[i][j-1]+matrix[i][j] area=0 rowsum[i][last]-rowsum[i,first-1] 2 3 3 3 3 n 0 stack2[top2]=stack1[top1] stack1[top1]=stack2[top2] C++语言 C 语言 分值 2.5 2.5 3 3 3
2014noip复赛模拟练习11(答案)

新学年就要开始了,爸爸把N元钱给了小青,让他购买一批文具,并作了以下要求:只能买圆珠笔、铅笔和铅笔芯,并且每样至少买一支,总数要超过30支,而且钱要全部花完。
当小青去到文具店时,发现圆珠笔8角钱一支、铅笔2角钱一支、铅笔芯1角钱一支。
小青怎么买才能符合爸爸的要求呢?请你编个程序帮他算出符合购买要求的所有方案总数。
Input一个整数N,表示购买文具一共的元数。
(1 <= N <= 50)Output一个整数,即符合购买要求的所有方案总数。
Sample Input 8Sample Output 135Sourceprogram ex1294;var n,i,j,k,sum:integer;beginreadln(n);n:=n*10;sum:=0;for i:=1 to n div 8 dofor j:=1 to n div 2 dobegink:=n-i*8-j*2;if (i+j+k>30) and (k>1) then inc(sum);end;writeln(sum);end.任意一个数都可以由1、2、3三个数组合而成。
如4有以下7种组合方案:1 + 1 + 1 + 11 + 1 + 21 +2 + 12 + 1 + 12 + 21 + 33 + 1你的问题来了,对于给定的一个数,请你计算出这个整数可以有多少个组合方案,其和由1、2、3组合而成。
数据输入输入包含多组数据,每一组数据中,输入数据的第一行为一个整数n(1<=n<=20),要分解的数。
数据输出这个整数的分解的组合数。
样例输入4样例输出7分析用f(n)表示将n按照1、2、3分解的方法数当n=1时,f(1)=1; {1}当n=2时,f(2)=2; {1+1},{2}当n=3时,f(3)=3; {1+1+1},{1+2},{2+1},{3} 当 n=k时 (k>=4)考虑最后添加的一个数字可能是1、2、3。
noip2014普及组复赛题解

1.珠心算测验注意看清题意:其中有多少个数,恰好等于集合中另外两个(不同的)数之和。
这样的题意加上100的规模,建议暴力3个for:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int n;int a[105];int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);int res=0;for(int i=1; i<=n; i++){int ok=0;for(int j=1; j<=n && !ok; j++) if(j!=i){for(int k=1; k<=n && !ok; k++) if(a[k]!=a[j]){if(a[j]+a[k]==a[i]) ok=1;}}res+=ok;}printf("%d\n",res);return 0;}2.比例简化L很小,还是枚举,然后比较的话建议用乘法比较,避免精度问题:#include<cstdio>#include<cstring>#include<iostream>using namespace std;int A,B,L;int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);}int main(){freopen("ratio.in","r",stdin);freopen("ratio.out","w",stdout);scanf("%d%d%d",&A,&B,&L);int ba=1000000,bb=1;for(int i=1; i<=L; i++){for(int j=1; j<=L; j++){if(gcd(i,j)==1 && i*B>=j*A){if(ba*j>=bb*i){ba=i, bb=j;}}}}printf("%d %d\n",ba,bb);return 0;}3.螺旋矩阵没一圈的数量有规律的,最外面一圈(n-1)*4,然后每往里n-2,直到后要么只有一个点,要么4个点。
2014noip复赛模拟练习10(答案)

喜羊羊运动会——撑杆跳高【试题描述】运动会马上就要开始了,撑杆跳高场地上,羊村的N(3 <= N <= 100 )个村民正排成一队有秩序地练习。
“好高啊,我都不知道自己能不能跳过去”,懒羊羊慢条斯理地说道。
“这么高,不知道最少要几只羊叠在一起才会够得着”,沸羊羊向来比较喜欢思考数学问题,这样说道。
试编一程序,计算出最少要几只羊叠在一起(一头羊踩在另一头羊的背上)才能够得着横杆(所谓够得着,指羊的身高总和不小于横竿的高度B)。
如果N头羊叠在一起,都够不着横竿,则输出“Impossible”【输入描述】第一行:两个整数N(3 <= N <= 100 )和B,表示队伍中羊的总数以及横竿的高度。
第二行:空格隔开的N个整数,表示每只羊的身高Hi(1 <= Hi <= 10000 )。
【输出描述】一行,一个整数,表示最少要几头羊才能够到横竿。
如果N只羊叠在一起都够不着则输出“Impossible”。
【输入样例】样例1:5 236 8 1 3 9样例2:6 161 2 3 1 3 5【输出样例】样例1:3样例2:Impossible【试题来源】武进区夏令营程序设计小能手PKprogram ex1797;var n,i,j,t,sum:integer;b,s:real;a:array[1..100] of integer;beginreadln(n,b);for i:=1 to n do read(a[i]);for i:=1 to n-1 dofor j:=i+1 to n doif a[i]<a[j] then begint:=a[i];a[i]:=a[j];a[j]:=t;end;s:=0; i:=0;sum:=0;repeatinc(i);s:=s+a[i];inc(sum);until (s>=b) or (i>=n);if s<b then write('Impossible') else write(sum);end.彩票摇奖(LOTTERY.PAS)【问题描述】为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。
NOIP2014 题解

NOIP2014 题解D1T1 : 生活大爆炸版石头剪刀布(rps)100% : 模拟。
另一种方法,可以先求出na,nb 的最小公倍数l ,在[1,l]的区间里模拟,对于剩下的部分,显然是循环了若干次[1,l]内的胜负情况,并剩余了一小部分,于是只要把两人的分数各自乘n div l,再对剩下的部分模拟即可。
复杂度 : O(na*nb)D1T2 : 联合权值(linp)30% : 穷举三个点,判断是否相邻,再统计权值并更新答案。
复杂度 : O(n^3)60% : 穷举一个点,并以该点为起点搜索,查找距离为2的结点,统计后更新答案。
复杂度 : O(n^2)100% : 记][i fa 为结点i 的父亲, ][i pow 是i 的权值。
题目给出了n 个点,n-1条边,那么这是一棵树。
那么考虑树形dp 。
很显然,距离为2的点在一棵树中有且仅有两种不同的位置,第一种是结点i 与结点]][[i fa fa ,第二种则是结点i 与结点j ,其中][][j fa i fa =。
记∑=][][j pow i sum,]}[{]max[j pow Max i =,其中][j fa i =。
那么有∑∑-+=])[]][[(*][]][[*][*2_j pow j fa sum j pow i fa pow i sum sum ans ,]}[*][]],[[*]{max[max _i y i x i fa pow i Max ans =,其中][],[i y i x 是i 的子节点中权值最大的两个。
复杂度 : O(n)D1T3 : 飞扬的小鸟(bird)30% : 搜索。
70% : 考虑动态规划,记],[j i f 为达到坐标),(j i 至少要点击几次屏幕。
则有]])1[,1[,]]1[*,1[(],[-+-+---=i y j i f k i x k j i f Min j i f ,注意考虑边界情况。
复杂度 : O(nm^2)100% : 上述动态规划超时的原因在于转移复杂度太高,如果能将转移复杂度降为O(1),那么就可以轻松将此题AC ,仔细想想发现对于所有可以用于更新],[j i f 的状态的高度都与j 同余(mod x[i-1]),那么在实际实现上述动态规划时,我们可以先穷举同余系,并以高度从低到高进行动态规划,在同一同余系中,记一个变量temp 为已经访问的状态中可以用于更新的最小值,每穷举到一个新的状态,把temp 更新为]),1[,1(j i f temp Min -+,并且只用temp+1更新其他状态。
2014noip普及组复赛测试(答案)

老师给笑笑布置了一份作业,笑笑不知如何解决。
老师给了一串很长的数列,要求从中找出连续的一段来使的总和最大。
【输入文件】:第一行包含一个整数n,表示数列的长度。
(n<=100000)第二行包含n个整数来描述这个数列,每个整数的的绝对值不超过1000。
【文件输出】:文件中只有一个整数,为最大的连续段总和。
【输入样例】:51 -23 1 -4【输出样例】4vars:array[1..10000] of longint;n,ii,t,ans:longint;beginreadln(n);for i:=1 to n doread(s[i]);t:=s[1];ans:=s[1];for i:=2 to n dobeginif t<0 then t:=s[i] else t:=t+s[i];if t>ans then ans:=t;end;writeln(ans);end.输入61 5 4 -2 63 输出17输入1024 -12 9 11 7 20 -8 15 3 18 输出87输入710 8 9 -5 12 6 11 输出51输入205 12 19 20 -7 -6 18 22 19 8 11 33 15 32 17 -30 4 14 24 -13输出230【问题描述】鲁宾逊先生有一只宠物猴,名叫多多。
这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。
在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。
有经验的多多一眼就能看出,每棵花生植株下的花生有多少。
为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。
”我们假定多多在每个单位时间内,可以做下列四件事情中的一件:1)从路边跳到最靠近路边(即第一行)的某棵花生植株;2)从一棵植株跳到前后左右与之相邻的另一棵植株;3)采摘一棵植株下的花生;4)从最靠近路边(即第一行)的某棵花生植株跳回路边。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
喜羊羊运动会——撑杆跳高【试题描述】运动会马上就要开始了,撑杆跳高场地上,羊村的N(3 <= N <= 100)个村民正排成一队有秩序地练习。
“好高啊,我都不知道自己能不能跳过去”,懒羊羊慢条斯理地说道。
“这么高,不知道最少要几只羊叠在一起才会够得着”,沸羊羊向来比较喜欢思考数学问题,这样说道。
试编一程序,计算出最少要几只羊叠在一起(一头羊踩在另一头羊的背上)才能够得着横杆(所谓够得着,指羊的身高总和不小于横竿的高度B)。
如果N头羊叠在一起,都够不着横竿,则输出“Impossible”【输入描述】第一行:两个整数N(3 <= N <= 100)和B,表示队伍中羊的总数以及横竿的高度。
第二行:空格隔开的N个整数,表示每只羊的身高Hi(1 <= Hi <= 10000)。
【输出描述】一行,一个整数,表示最少要几头羊才能够到横竿。
如果N 只羊叠在一起都够不着则输出“Impossible”。
【输入样例】样例1:5 236 8 1 3 9样例2:6 161 2 3 1 3 5【输出样例】样例1:3样例2:Impossible【试题来源】武进区夏令营程序设计小能手PK program ex1797;var n,i,j,t,sum:integer;b,s:real;a:array[1..100] of integer;beginreadln(n,b);for i:=1 to n do read(a[i]);for i:=1 to n-1 dofor j:=i+1 to n doif a[i]<a[j] then begint:=a[i];a[i]:=a[j];a[j]:=t;end;s:=0; i:=0;sum:=0;repeatinc(i);s:=s+a[i];inc(sum);until (s>=b) or (i>=n);if s<b then write('Impossible') else write(sum);end.彩票摇奖(LOTTERY.PAS)【问题描述】为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。
该彩票的规则是:(1)每张彩票上印有7个各不相同的号码,且这些号码的取指范围为1~33。
(2)每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
(3)共设置7个奖项,特等奖和一等奖至六等奖。
兑奖规则如下:特等奖:要求彩票上7个号码都出现在中奖号码中。
一等奖:要求彩票上有6个号码出现在中奖号码中。
二等奖:要求彩票上有5个号码出现在中奖号码中。
三等奖:要求彩票上有4个号码出现在中奖号码中。
四等奖:要求彩票上有3个号码出现在中奖号码中。
五等奖:要求彩票上有2个号码出现在中奖号码中。
六等奖:要求彩票上有1个号码出现在中奖号码中。
注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。
例如,中奖号码为23 31 1 14 19 17 18,则彩票12 8 9 23 1 16 7由于其中有两个号码(23和1)出现在中奖号码中,所以该彩票中了五等奖。
现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。
输入文件(LOTTERY.IN):输入文件的第一行只有一个自然数N ≤ 1000,表示小明买的彩票张数;第二行存放了7个介于1和33之间的自然数,表示中奖号码;在随后的N行中每行都有7个介于1和33之间的自然数,分别表示小明所买的N张彩票。
输出文件(LOTTERY.OUT):依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。
输入输出样例:【输入样例】LOTTERY.IN223 31 1 14 19 17 1812 8 9 23 1 16 711 7 10 21 2 9 31【输出样例】LOTTERY.OUT0 0 0 0 0 1 1彩票摇奖(LOTTERY.PAS)【问题描述】为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。
该彩票的规则是:(1)每张彩票上印有7个各不相同的号码,且这些号码的取指范围为1~33。
(2)每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
(3)共设置7个奖项,特等奖和一等奖至六等奖。
兑奖规则如下:特等奖:要求彩票上7个号码都出现在中奖号码中。
一等奖:要求彩票上有6个号码出现在中奖号码中。
二等奖:要求彩票上有5个号码出现在中奖号码中。
三等奖:要求彩票上有4个号码出现在中奖号码中。
四等奖:要求彩票上有3个号码出现在中奖号码中。
五等奖:要求彩票上有2个号码出现在中奖号码中。
六等奖:要求彩票上有1个号码出现在中奖号码中。
注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。
例如,中奖号码为23 31 1 14 19 17 18,则彩票12 8 9 23 1 16 7由于其中有两个号码(23和1)出现在中奖号码中,所以该彩票中了五等奖。
现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。
输入文件(LOTTERY.IN):输入文件的第一行只有一个自然数N ≤ 1000,表示小明买的彩票张数;第二行存放了7个介于1和33之间的自然数,表示中奖号码;在随后的N行中每行都有7个介于1和33之间的自然数,分别表示小明所买的N张彩票。
输出文件(LOTTERY.OUT):依次输出小明所买的彩票的中奖情况(中奖的张数),首先输出特等奖的中奖张数,然后依次输出一等奖至六等奖的中奖张数。
输入输出样例:【输入样例】LOTTERY.IN223 31 1 14 19 17 1812 8 9 23 1 16 711 7 10 21 2 9 31【输出样例】LOTTERY.OUT0 0 0 0 0 1 1vara:array[1..33,0..1000]of boolean; b:array[0..7]of longint;n,i,j,u,s:longint;beginreadln(n);for i:=0 to n dofor j:=1 to 7 dobeginread(u);a[u,i]:=true;end;for i:=1 to n dobeginfor j:=1 to 33 doif a[j,0] then if a[j,i] then inc(s);inc(b[s]);s:=0;end;for i:=7 downto 1 dowrite(b[i],' ');end.贪污排名(Rank.pas\c\cpp)【题目描述】党的十七大热烈召开,胡书记发表了热情洋溢的讲话,其中一个内容是腐败问题,胡书记强调共产党与贪污腐败水火不容,体现了反腐倡廉的决心。
2007年的确是不平凡的一年,尤其在反腐败问题上,确定做了不少工作,抓了N个腐败分子,每抓一个贪官都要求他报出自己的财富,用一个整数表示,胡书记每抓一个都想知道这个贪官在已经抓获的贪官中按照财富排第几名。
党把这个光荣的任务交给了你。
Input输入文件Rank.in第一行输入一个整数N,表示今年抓获贪官的数量。
接下来N行,每行一个整数,表示按照今年被抓获的顺序给出这N个贪官的财富。
Output输出文件Rank.out输出N行,第i行表示第i个贪官的财富在1-i个贪官中排第几位。
Sample Input67868403989Sample Output122341Hint【数据说明】100%的数据N<=45000,财富互不相同且不超过2*10^9(虽然现实中可能不止)30%的数据N<=8000Sourcevars:array[1..45000] of longint;a,b:array[1..45000,1..2] of longint; n,i,j,k,t,ss:longint;beginreadln(n);readln(s[1]);writeln('1');for i:=2 to n do beginreadln(s[i]);t:=s[i]; j:=1; ss:=0;while j<>0 do beginif t>s[j] then begina[j,1]:=a[j,1]+1;k:=j; j:=b[j,1];endelse beginss:=ss+a[j,1]+1;a[j,2]:=a[j,2]+1;k:=j; j:=b[j,2];end;end;if t>s[k] then b[k,1]:=i else b[k,2]:=i;writeln(ss+1);end;end.所谓丑数,就是指那些因子只含2,3,5的数。
1,2,3,4,5,6,8,9,10,12,15是最前面的11个丑数。
为了方便起见,把1也看作是丑数。
请你编写一个程序,输入n,n<3000,寻找并打印第n个丑数。
如输入:11输出:15const maxn=3000;mark:array[1..3] of integer=(2,3,5);var I,j,n:longint;min:real;p:array[1..3] of longint;ugly:array[1..maxn] of real;begin write(‘input n:’);readln(n);ugly[1]:=1;for I:=1 to 3 do p[I]:=1;for I:=2 to n dobegin min:=ugly[p[1]]*mark[1];for j:=2 to 3 doif ugly[p[j]]*mark[j]<min then min:= ugly[p[j]]*mark[j];ugly[I]:=min;for j:=1 to 3 doif ugly[p[j]]*mark[j]=min then p[j]:=p[j]+1;end;writeln(ugly[n]:0:0);readlnend.输入40输出144输入2999输出278628139010输入200输出16200输入1500输出859963392锁妖塔的建造很特别,塔总共有n层,但是高度却不相同,这造成了小A 爬过每层的时间也不同。
小A会用仙术,每用一次可以让他向上跳一层或两层,但是每次跳跃后小A都将用完灵力,必须爬过至少一层才能再次跳跃。
小A想用最短的时间爬到塔顶,可是他不能找到时间最短的方案。
所以请你帮他找到一个时间最短的方案让他爬到塔顶,小A只关心时间,所以你只要告诉他最短时间是多少就可以了。
[输入格式]tower.in第一行一个整数n (n<=10000),表示塔的层数。