2014noip复赛模拟练习10(答案)

合集下载

NOIP2014普级组复赛试题

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答案

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复赛提高组标准答案

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(答案)

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普及组复赛题解

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个点。

NOIP2014 题解

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更新其他状态。

NOIP2014复赛普及组第一题题解

NOIP2014复赛普及组第一题题解

活动园地NOIP2014复赛普及组第一题题解原题一、题目简化:求N个正数中有多少个数是这些数中其它两个数的和。

3<=N<=100; 每个正整数M:1<=M<=10000;二、过程分析:试题显然可以分成三个步骤求解:1、先求出N个数中每两个数的和;2、判断这些和中有没有重复,重复的数只留下一个;3、N个数中的每一个数都与这些和比较,若相等些记下,比较完成,即得其解。

三、算法与策略:三个步骤都采用一一列举所有可能的方法,是典型的枚举。

四、程序设计思路:1、一维数组A存放N个数,一维数组B存放两两相加的和;求和、判断重复、比较两数是否相等,都采用两重循环,i 控制外循环,j 控制内循环,k表示数组B的下标变化,ans表示题目答案。

数组a最多100个元素,考虑到用循环,为防止下标越界,可适当把数组开大一些,a[0..101];数组b中元素数是N个数两个数两两相加的和的个数,由于N最大是100,所以和的个数最多是1+2+3+……99=4950个,则b[0..5000]五、程序设计:program count;vara:array[0..101] of longint;b:array[0..5000] of longint;n,ans,i,j,k:longint;beginassign(input,'count.in');reset(input);assign(output,'count.out');rewrite(output);readln(n);for i:=1 to n doread(a[i]);fillchar(b,sizeof(b),0);**下面开始步骤1:a中的数两两相加放在b中**k:=1;for i:=1 to n-1 dofor j:=i+1 to n dobeginb[k]:=a[i]+a[j];inc(k);end;**下面开始步骤2:筛掉b中的重复数据:**for i:= 1 to (k-1)-1 do for j:=i+1 to k-1 do begin if b[i]:=b[j] then b[j]:=0; end;**下面开始步骤3:比较a 数组中有多少个数与b 数组中的数相等:** ans:=0; for i:=1 to n dofor j:=1 to k-1 do begin if (a[i]=b[j]) then inc(ans); end;**比较结束,结果已得出,下面输出结果,关闭文件,结束程序** write(ans); close(input) close(output); end.六、时间复杂度分析:三个步骤采用了三个双重循环,每个双重循环运行约N ·∑-=11n i i 次,若N =100,则整个程序运行约150万次操作,T (N )=0(N 3)理论上讲,还可以忍受。

NOIP2014提高组复赛试题

NOIP2014提高组复赛试题
已知小 A 和小 B 一共进行 N 次猜拳。每一次赢的人得 1 分,输的得 0 分;平局两人都得 0 分。现请你统计 N 次猜拳结束之后两人的得分。
【输入】 输入文件名为 rps.in。 第一行包含三个整数:N,NA,NB,分 别 表 示 共 进 行 N 次猜拳、小 A 出拳的周期
长度,小 B 出拳的周期长度。数与数之间以一个空格分隔。 第二行包含 NA 个整数,表示小 A 出拳的规律,第三行包含 NB 个整数,表示小 B 出拳的
【输入输出样例】 link.in
5 12 23 34 45 1 5 2 3 10
20 74
link.out
【样例说明】
本例输入的图如上所示,距离为 2 的有序点对有(1,3)、(2,4)、(3,1)、(3,5)、(4,2)、 (5,3)。其联合权值分别为 2、15、2、20、15、20。其中最大的是 20,总和为 74。
这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。
乙 甲对乙的 甲 结果
剪刀 石头 布 蜥蜴人 斯波克
表一 石头剪刀布升级版胜负关系
剪刀
石头

蜥蜴人










斯波克
输 输 赢 赢 平
现在,小 A 和小 B 尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的, 但周期长度不一定相等。例如:如果小 A 以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为 6 的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头 -剪刀-蜥蜴人-斯波克-……”,而如果小 B 以“剪刀-石头-布-斯波克-蜥蜴人”长度为 5 的 周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克蜥蜴人-……”

2014noip普及组复赛测试(答案)

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)从最靠近路边(即第一行)的某棵花生植株跳回路边。

NOIP2014复赛提高组模拟试题

NOIP2014复赛提高组模拟试题

CCF 全国信息学奥林匹克联赛(NOIP2014)复赛提高组 day1(请选手务必仔细阅读本页内容)一、题目概况二、提交源程序文件名三、编译命令(不包含优化开关)注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。

2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。

3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) 64x2 Dual Core CPU 5200+, 2.71GHz,内存 2G,上述时限以此配置为准。

4、只提供 Linux 格式附加样例文件。

5、特别提醒:评测在 NOI Linux 下进行。

6、为了方便评测请以自己名字的拼音为文件夹名,而且将原程序直接保存在文件夹内,不用再新建子文件夹。

1.斐波那契(pf.pas/c/cpp)【问题描述】是个斐波那契数迷。

他是如此的酷爱这个数列,因此他想知道很多关于这个数列的东西,比方说第个斐波那契数是多少啊、前项的和是多少啊如何用若干个斐波那契数的和表示一个自然数啊之类之类的。

今天他希望知道的是:第个斐波那契数的末尾一位是多少?记表示第个斐波那契数,。

【输入】输入文件名为pf.in,共行。

输入只有一个数。

【输出】输出文件名为pf.out,仅一行,即第个数的最后一位。

【输入输出样例】【数据说明】对于3的数据满足,;对于的数据满足,。

(toy.pas/c/cpp)【问题描述】一天小D去超市买回来了一个玩具,这个玩具是由n个球和一些支架组成,每一个支架连接着两个不同的球,通过支架每两个球之间的简单路径有且只有一条,如果某一个支架的两端的球全被拿走,那么这个玩具就会垮掉。

小D无聊的时候开始拿走球,问,他有多少中拿球方案,使玩具不垮。

【输入】输入文件名为toy.in。

第一行一个数n 表示球的个数接下来若干行每行两个数a,b表示有一个支架连接着球a和球b【输出】输出文件名为toy.out.一行一个数ans 表示DRJ拿球的方案数mod 109+7(可以一个球也不拿)【输入输出样例】【数据说明】30%的数据满足n<=20;50%的数据满足n<=1000100%的数据满足 n<=500000;(running.cpp/c/pas)【问题描述】某校开展了同学们喜闻乐见的阳光长跑活动。

小学组2014

小学组2014

2014年山东省信息学奥林匹克联赛(NOIP2014)复赛小学组试题(请选手务必仔细阅读本页内容)一.题目概况二.提交源程序文件名注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。

2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。

1.读书(book.cpp/c/pas)【问题描述】你的家长最近给你买了一本新书,共n页。

你第一天看了a页,以后每天比前一天多看b页,那么最后一天看多少页?【输入】输入文件名为book.in。

输入共一行,包含三个正整数n、a、b,中间用空格隔开。

【输出】输出文件名为book.out。

输出共一行,包含一个正整数,表示最后一天看的页数。

【输入输出样例】【样例说明】第1天,25页;第2天,30页;第3天,35页;第4天,10页。

【数据范围】对于50%的数据,0<n<=30,000;对于100%的数据,0<n<=2,000,000,000。

2.蚂蚁爬竹竿(ant.cpp/c/pas)【问题描述】n只蚂蚁以每秒1厘米的速度在长为L厘米的水平放置的竹竿上爬行。

当蚂蚁爬到竹竿的任意一个端点时就会掉落。

对于每只蚂蚁,我们知道开始时它距离竹竿左端的距离为ai。

请计算所有蚂蚁都掉落下竹竿时所需的最短时间。

【输入】输入文件名为ant.in。

第一行,n,蚂蚁的数量。

第二行,L,竹竿的长度。

第三行,n只蚂蚁距离竹竿左端点的距离。

【输出】输出文件名为ant.out。

输出共一行,包含一个正整数,表示所有蚂蚁都掉下竹竿所需的最短时间。

【输入输出样例】【样例说明】3只蚂蚁都爬下竹竿最快的方法是:第1只蚂蚁往左爬下竹竿需要2秒;第2只蚂蚁往右爬下竹竿需要4秒;第3只蚂蚁往右爬下竹竿需要3秒。

所以3只蚂蚁全都爬下竹竿所需的最短时间是4秒。

【数据范围】对于50%的数据:1<=L<=10000;1<=n<=1000;0<=ai<=L;对于100%的数据:1<=L<=1000000000;1<=n<=1000000;0<=ai<=L。

2014NOIP测试题历年试题

2014NOIP测试题历年试题

NOIP2013一、单项选择题(共15 题,每题1.5 分,共计22.5 分;每题有且仅有一个正确选项)1.一个32 位整型变量占用()个字节。

A. 4B. 8C. 32D. 1282.二进制数11.01 在十进制下是()。

A. 3.25B. 4.125C. 6.25D. 11.1253.下面的故事与()算法有着异曲同工之妙。

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‚从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:‘从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事....’‛A. 枚举B. 递归C. 贪心D. 分治4.1948 年,()将热力学中的熵引入信息通信领域,标志着信息论研究的开端。

A. 冯·诺伊曼(John von Neumann)B. 图灵(Alan Turing)C. 欧拉(Leonhard Euler)D. 克劳德·香农(ClaudeShannon)5.已知一棵二叉树有2013 个节点,则其中至多有()个节点有2 个子节点。

A. 1006B. 1007C. 1023D. 10246.在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通图。

右图是一个有5 个顶点、8 条边的连通图。

若要使它不再是连通图,至少要删去其中的()条边。

A. 2B. 3C. 4D. 57.斐波那契数列的定义如下:F1 = 1, F2 = 1, Fn = Fn –1 + Fn –2 (n ≥3)。

如果用下面的函数计算斐波那契数列的第n 项,则其时间复杂度为()。

int F(int n){if (n <= 2)return 1;elsereturn F(n - 1) + F(n - 2);}A. O(1)B. O(n)C. O(n2)D. O(Fn)8.二叉查找树具有如下性质:每个节点的值都大于其左子树上所有节点的值、小于其右子树上所有节点的值。

那么,二叉查找树的()是一个有序序列。

NOIP2014普及组复赛解题报告

NOIP2014普及组复赛解题报告

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):在此征求一下大神的意见,如有更快的做法,敬请奉上小结:这道题很简单,但很多人没有做对的原因就是没有好好理解题意,但是根本原因其实还在于心态太骄傲了,认为是第一题就可以轻视,这样是不好的,水题我们更要做好啊,你想想同样是100分,这100分多么好拿,所以是水题、越该放平心态,细心地做。

当时我正是由于重视(2013年第一题爆零的教训),用了整整15分钟才做好,最后得了100分Problem 2 比例简化这道题目是说,给定A和B,求解一组A’和B’,满足以下条件:A′B′−AB≥00<A′,B′≤LA′和B′互质首先,想一个总体的框架:我们发现L≤100,因此可以枚举A′和B′,然后判断是否A’B’满足上述条件,并且打擂台求比值最小的一组就行了,打擂台的复杂度是O(1)。

设验证的复杂度为O(k),则总的算法的复杂度为O(kL2),其中L2是104,所以我们只要保证k的大小在100以内就一定没有问题。

现在要求两个分数的差值,该怎么办呢?高精除!很多人一下就想到了,当时我在赛场上就是这么想的,但是又仔细一考虑。

2014noip复赛模拟练习1(答案)

2014noip复赛模拟练习1(答案)

【问题描述】请统计某个给定范围[L,R]的所有整数中,数字N出现的次数。

【输入格式】共1行,为三个正整数L、R和N,之间用空格隔开。

(1≤L≤R≤10000)。

【输出格式】仅1行,表示数字N出现的次数。

如输入2 22 2 则输出6var a,b,c,d,e,f,n:integer;beginassign(input,'two.in');reset(input);assign(output,'two.out');rewrite(output);readln(a,b,n);f:=0;d:=0;for c:=a to b dobegine:=c;repeatd:=e mod 10;e:=e div 10;if d=n then inc(f);until e=0;end;writeln(f);close(input);close(output);end.输入2 100 5输出 20 输入 1 1000 9 输出 300输入 2222 2223 2 输出 7 输入 9993 10000 2 输出 02.用自然数1,2,3,4,5,。

构成连续数1234567891011…9899100101…从键盘输入整数m(20000m),输出第m位数字。

样例输入输出:输入:m=15输出:2①m=11②m=194③m=100007④m=199992var p,d,i,j,w,c,m:integer;beginwrite('m=');readln(m);c:=1;i:=1;while c<m do begini:=i+1;w:=1;j:=i;while j>=10 do beginj:=j div 10;w:=w+1;end;c:=c+w;end;d:=c-m+1;for j:=1 to d do beginp:=i mod 10;i:=i div 10;end;writeln(p);end.3.聪明的囚犯:传说从前有一个残暴的国王,喜欢杀戮百姓。

NOIP2014普及组复赛试题讲解(c++版本)

NOIP2014普及组复赛试题讲解(c++版本)
- 15 -
确定解题思路AC
思路:搜索+DP 枚举出选那些行 算出j列各行之间的分数w[j],k,j两列之间的分数v[k][j]。 f[i][j]表示已经选了i(数量)列,最后一列是j (下标)的最小分数 且第i列是j 状态转移方程:f[i][j]=min(f[i-1][k]+w[j]+v[k][j])。
-6-

第3题 “ 螺旋矩阵”简述
一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动; 如果前方是未曾经过的格子,则继续前进,否则右转;重 复上述操作直至经过矩阵中所有格子。根据经过顺序,在 格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。 下图是一个n = 4 时的螺旋矩阵。
- 14 -
暴力搜索程序模块
int main() { cin>>n>>m>>row>>col; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; w(1); cout<<ans; return 0; }
- 18 -
试题分析
BYE
温馨提示:
本题解内的程序都已经AC,由
于代码较长,可以查看CPP文件
The END
2017. 07. 28
试题分析
NOIP2014 普及组复赛题解
NOIP2014普及组C++
2017. 07. 28
第1题 “珠心算测验”简述
某学校的珠心算老师采用一种快速考察珠心算加法 能力的测验方法。他随机生成一个正整数集合,集 合中的数各不相同,然后要求学生回答:其中有多 少个数,恰好等于集合中另外两个(不同的)数之 和?

noip2014模拟赛

noip2014模拟赛

NOIP2014模拟赛提高组By Aponoia注意:最终测试时,所有编译命令均不打开任何优化开关。

数竞神器【问题描述】作为数学竞赛的一员,Aponoia一直在研究一种能够造福所有数竞人的神器。

这种神器最终将能全自动地解决所有数学问题。

历经数年的潜心钻研之后Aponoia终于研发出了这种神器的一个试用版本。

和众多的软件类似,在正式发布这款神器之前,必须先要经过多轮的内测。

因此,Aponoia首先找到了数竞的老师来试验这一神器。

由于现在数竞正在学习数论,于是老师随口编了一个问题:“给定一个正整数n,以及一个质数p,求n、2n、3n、……、(n-1)*n、n*n关于模p的逆元”。

这时,Aponoia却尴尬的发现他开发的神器居然崩溃了。

无奈之下,Aponoia只能找到信息竞赛大神——你,来帮助他完善神器。

【输入格式】第一行两个正整数n,p,含义见题面。

【输出格式】一共n行,每行一个整数。

第i行的整数表示i*n关于模p的逆元。

【样例输入】5 7【样例输出】35162【数据规模和约定】对于30%的数据,2 ≤ n < p ≤ 3000。

对于60%的数据,2 ≤ n < p ≤ 100000。

对于100%的数据,2 ≤ n < p ≤ 3000000。

数据保证p为质数。

粉刷匠【问题描述】在你的帮助之下,Aponoia很快就完成了神器的开发。

这款神器在面市之后受到了各方好评,Aponoia也借此发了一笔大财。

在得到这笔钱后,Aponoia决定建造一栋别墅来犒劳一下自己。

可是在别墅建造过程中,Aponoia却对派来的粉刷匠很不满意。

在Aponoia看来,派来的粉刷匠简直连涂鸦的水平都不如。

于是,Aponoia决定亲自上阵,自己来刷墙。

然而,当Aponoia真正开始刷墙时,他才发现这真不是件轻松的活。

每当Aponoia将一段围墙刷成一种颜色后,他无法直接从整体上欣赏整面墙:比如当前墙上一共有几种颜色的油漆。

NOIP2014普及组复赛试题解答

NOIP2014普及组复赛试题解答

NOIP2014普及组复赛试题解答NOIP2014普及组复赛试题解答1.珠心算测验#includeusing namespace std;int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);int n;scanf("%d",&n);int a[n+1],j,k,out=0;bool pd=false;for(int i=1;i<=n;++i)scanf("%d",&a[i]);for(int i=1;i<=n;++i){j=1;do{k=1;do{if((i!=j)&&(j!=k)&&(k!=i)&&(a[i]==a[j]+a[k])) {out++;pd=true;}k++;}while(k<=n&&pd==false);j++;}while(j<=n&&pd==false);pd=false;}printf("%d",out);fclose(stdin);fclose(stdout);return 0;}2.比例简化考虑到输出结果必须是最贴近原比值且互质的一对正整数,如果采用除法再取整,则会导致结果偏差较大。

由于1≤L≤100,可以枚举其所有组合,再在枚举结果中取最贴近的那一对正整数。

可以用二维数组的下标来存储A',B'的值,二维数值元素存储A'/B'与A/B的差值。

①读取A、B、L的值;②考虑极端情况B/A>L,当出现此情况时,直接将赋值A'=1;B'=L,以减少计算时间;③枚举所有A'/B'的值,并存储在二维数组元素s[A'][B']中;④求二维数组的最小值;⑤输出A' B'。

2014noip复赛模拟练习18(答案)

2014noip复赛模拟练习18(答案)

1. TOM有一个无穷序列中如下:110100100010000100000。

请你帮助TOM找出在这个无穷序列中指定位置上的数字输入格式Input Format第一行一个正整数N,表示询问的次数;接下来的N行一个正整数Ai,Ai表示在序列中的位置。

输出格式Output FormatN行,每一行为0或1,表示序列第Ai位上的数字。

对于100%的数据有N<=1500000,Ai<=10^9var n,i:longint;x,z,y:int64;begin readln(n);for i:=1 to n do beginreadln(x); z:=(x-1)*2; y:=trunc(sqrt(z));if z=y*(y+1) then writeln('1') else writeln('0');end;readln;readln;end.输入 39910111输出0 0 1输入 57 1024 15 10000 4 输出1 0 0 0 12. 输入一个正整数N(1 <= N <=20)后,可以得到一个N*N的数字螺旋方阵,分别求该方阵中的主对角线与副对角线上的数字之和S,P,输出S、P的差。

例如:N=5 得到的数字螺旋方阵如下:1 2 3 4 5 其中:主对角线从左上角到右下角,得到 16 17 18 19 6 的数字之和为:S=1+17+25+21+9=73 15 24 25 20 7 副对角线从右上角到左下角,得到 14 23 22 21 8 的数字之和:P=5+19+25+23+13=85 13 12 11 10 9 S-P= - 12Input 一个正整数NOutput主对角线与副对角线上的数字之和的差。

Sample Input 5Sample Output -12var n,i,j,t,f,l,q,z:integer;s1,s2:longint;a:array[1..20,1..20] of integer;beginreadln(n);t:=1; f:=1; l:=n;i:=1;q:=1;z:=n;while t<=n*n dobegincase f of1:beginfor j:=q to z do begin a[i,j]:=t;inc(t);end;f:=2; q:=i+1;dec(l); z:=l+q-1;end;2:beginfor i:=q to z do begin a[i,j]:=t;inc(t);end;f:=3;q:=j-1; z:=q-l+1;end;3:beginfor j:=q downto z do begin a[i,j]:=t;inc(t); end;f:=4;q:=i-1;dec(l);z:=q-l+1;end;4:beginfor i:=q downto z do begin a[i,j]:=t;inc(t); end;f:=1;q:=j+1;z:=q+l-1;end;end;end;s1:=0;s2:=0;for i:=1 to n do s1:=s1+a[i,i];for i:=n downto 1 do s2:=s2+a[n-i+1,i];writeln(s1-s2);end. 输入 7 输出 -24输入 20 输出 -200 输入 12 输出-7215 输出 -1123.字母A,B,C的所有可能的组合(按字典顺序排序)是:A, AB,ABC,AC,B,BC,C每个组合都对应一个字典顺序的序号,如下所示:1A2AB3ABC4AC5B6BC7C找出某个字母组合的字典序号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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【试题来源】武进区夏令营程序设计小能手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)【问题描述】为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。

该彩票的规则是:(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 Input6782468403989Sample Output122341Hint【数据说明】100%的数据N<=45000,财富互不相同且不超过2*10^9(虽然现实中可能不止)30%的数据N<=8000Source∙var∙ s:array[1..45000] of longint;∙ a,b:array[1..45000,1..2] of longint;∙ n,i,j,k,t,ss:longint;∙begin∙ readln(n);∙ readln(s[1]);∙ writeln('1');∙ for i:=2 to n do begin∙ readln(s[i]);∙ t:=s[i]; j:=1; ss:=0;∙ while j<>0 do begin∙ if t>s[j] then begin∙ a[j,1]:=a[j,1]+1;∙ k:=j; j:=b[j,1];∙ end∙ else begin∙ ss:=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都将用完灵力,必须爬过至少一层才能再次跳跃。

相关文档
最新文档