2014noip复赛模拟练习31

1. 数字反转(reverse.pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。(参见样例2)

【输入】输入文件名为reverse.in。输入共一行,一个整数n。

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

输出共一行,一个整数,表示反转后的新数。

【输入输出样例1】

reverse.in reverse.out

123 321

【输入输出样例2】

reverse.in reverse.out

-380 -83

【数据范围】 -1,000,000,000≤N≤1,000,000,000。

2. 查找“支撑数”【试题描述】在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗?每行输出5项。

【输入描述】

第一行为整数m,表示输入的整数个数。(3<= m <=100 )

第二行为m个整数。

【输出描述】

若干个支撑数

【输入样例】

14

1 3

2 4 1 5

3 9 7 10 8 23 85 43

【输出样例】

3 4 5 9 10

85

3. 编程即将上课,为了能让每个同学都能拿到教材,老师让star去发教材,由于star比较内向,见到不认识的新同学你会害羞得什么话也不和他说,什么事情也不对他做,当然更不可能发书给他了。怎么办呢?老师的任务不能不完成啊!当然,遇到star认识的同学star还是很乐意交流的,于是star会要求他认识的同学继续帮他发书(不管对方认不认识他),star害羞的情绪也影响了其他所有同学,于是其他同学也只会发书给他认识的人。最后star要统计还有哪些同学没有拿到书,他就只能硬着头皮,顶着极大地心理压力给他们发书(老师的任务一定要完成啊)所有的学生都用学号来表示。

Input

第1行:三个数k,n,m(k代表你的学号,n代表人数,m代表关系数n(n<250)和m(m<10000)

第2..m+1行: 每行两个数a和b代表a认识b,(不代表b认识a)同一行的a,b不会相同

Output

第1行: 所有没有拿到教材的同学的学号,学号从小到大排列。如果所有同学都能拿到书,那么输出0

Sample Input

1 4 6

1 2

2 3

4 1

3 1

1 3

2 3

Sample Output 4

Hint

输出说明:

只有一个同学,4号学生没有拿到书

4. 袁绍的刁难(recruitment)

题目描述:

黄巾之乱后,郭嘉到了袁绍的统辖地区,结果袁绍想给我们的郭嘉大大一个下马威,且正值他招募将领的时候,于是乎,袁绍就让郭嘉大大去替他招募将领。

这时候有很多很多的将领到袁绍处报到(别人家底厚,四世三公哪~~),每个将领的编号依次为1、2、3……N,第i个将领的武力值为3^(i-1)。

袁绍需要我们的郭嘉大大招纳任意个将领,而郭嘉选中的将领有一个“总武力值”为各个将领的武力值之和。例如:郭嘉这一次招募了第一个将领和第三个将领,那么“总武力值”为1+9=10。

袁绍想知道,他可以获得的第k小的“总武力值”是多少,请你帮助我们的郭嘉大大告诉袁绍这个第k大的“总武力值”。

从文件中读入k,输出郭嘉能够获得的,第k大的“总武力值”。

输入:

数据包含n+1行,第一行读入n(n≤100)。以下n行每行包含一个k。

输出:

输出包含n行,每行输出一个对应的结果。

输入样例:

1

7

输出样例:

13

样例说明:

郭嘉能够拿到的总武力值从小到大为1、3、4、9、10、12、13……所以第7小的总武力值是13。

对于50%的输入文件,有k≤5000。

对于100%的输入文件,有k≤2^31-1。

5. 数列计算

【试题描述】

有一个数列A1,A2,…, An(1≤n≤30),其中A1=0,永远不变,从第二个数A2开始,它可以是前面的数加1,也可以是前面的数减1。例如n=4,可能的数列有:

0 1 2 3

其和S=6(即4个数的和)

0 1 2 1

S=4

0 1 0 1

S=2

0 1 0 -

1 S=0

0 -

1 0 1

S=0

0 -1 0 -

1 S=-2

0 -1 -2 -

1 S=-4

0 -1 -2 -

3 S=-6

问题:给出n和S,问满足条件的数列有多少。

【输入描述】2个整数

【输出描述】一个整数(满足条件的数列的个数)

【输入样例】 4 0

【输出样例】 2

6. 铺地毯(carpet.cpp/c/pas)

【问题描述】

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标

系的第一象限)铺上一些矩形地毯。一共有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。

输入3

1 0

2 3

0 2 3 3

2 1

3 3

2 2 输出3

【输入输出样例说明】

如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。

NOIP复赛模拟题一

NOIP复赛模拟题一 1、与3和5无关的数(num.cpp) 描述 一个正整数x,如果它能被x整除,或者它的十进制表示法中某个位数上的数字为x,则称其为与x相关的数.现求所有小于等于n(n<300)的与x无关的正整数的平方和. <300)的与x无关的正整数的平方和.

输入 输入第一行为一个整数N,表示小白鼠的数目。 下面有N行,每行是一只白鼠的信息。第一个为正整数,表示白鼠的重量,; 第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。 注意:白鼠的重量各不相同。 输出 按照白鼠的重量从小到大的顺序输出白鼠的帽子颜色。 样例输入 3 30 red 50 blue 40 green 样例输出 red green blue 3、滑雪(skate.cpp) 描述 Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 5 16 17 18 19 6

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。允许输入一组数后立即输出对应的结果。样例输入:2 1 1 2 1 6 2 6 3 样例输出: 1 -1 var v,u,t,k,n,i:integer; begin readln(n); for i:=1 to n do begin readln(t,k,u,v); if v*t>U*(t-k) then writeln(1); if v*t

100 20 50 30 100 50 45 25 100 80 27 17 输出: -1 1 1 4、输入: 3 150 77 29 23 127 11 22 13 139 22 13 7 输出: 1 -1 -1 二、小球路程(文件名:XQLC.PAS ) 已知小球从100米高度自由下落,落地后反弹起,又落地,又弹起,……。每次弹起的高度都是上一次高度的一半。求小球第N次反弹起的高度和球在整个过程所经过的路程(包括下落和反弹),用键盘输入N,输出反弹高度和经过路程,结果保留两位小数。 输入输出示例:输入:2 输出:25.00 225.00 Var n,b:integer;s,h:real; begin readln(n); h:=100; for b:=1 to n do begin s:=s+h; h:=h/2; s:=s+h; end; writeln(h:0:2); writeln(s:0:2); end. 三、商品编码(文件名:spbm.pas) 某种商品编码是一个由13位数字组成的可识别的编码。通过对这些编码数字使

noip普及组复赛模拟试题29

一、从一张长A毫米、宽B毫米的长方形纸片上剪下尽可能大的正方形,如果剩下的部分不是正方形,就在剩下的纸片上再裁下一个尽可能大的正方形,……,求裁剪的第N 个正方形的边长?A、B、N(1≤A,B≤30000,1≤N≤100)用键盘输入。 输入输出样例:输入:A,B,N=9 5 2↙输出:4 输入:A,B,N=6 4 4↙输出:2 二、所谓H数,是指该数除1以外最多只有2,3,5,7四种因子,如630即为H数,而22不是。要求对键盘输入的自然数N,求出第N个H数。如N=30,应输出49。规定要求的H数不超出长整型数的范围。 三、某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:7 279 5 279这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:5 279 7 279则按输出错误处理,不能得分。【输入】输入文件scholar.in包含n+1行:第1行为一个正整数n,表示该校参加评选的学生人数。 第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。所给的数据都是正确的,不必检验。 【输出】输出文件scholar.out共有5行,每行是两个用空格隔开的正整数, 依次表示前 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150% (向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。【输入】输入文件名为score.in。第一行,两个整数n,m(5 ≤n ≤5000,3 ≤m ≤n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于n。第二行到第n+1 行,每行包括两

NOIP模拟

NOIP 复赛模拟5 1、求和(sum.cpp) 问题描述: 输入整数n ,求1~n 之间所有数的和。 输入格式: 第一行为正整数t(≤100),表示数据组数;接下来t 行,每行一个整数n ,n 的绝对值小于10000。 输出格式: 对于每组数据,输出相应的结果。 输入输出样例: 2、超级阶乘(factorials.cpp) 问题描述: 阶乘是我们熟知的,n!=n*(n-1)*(n-2) (1) 下面我们来定义超级阶乘:n!!...!(一共有k 个!): n!!...!= n*(n-k)*(n-2k)…*t ,当k 不能整除n 时,t=n%k ,否则t=k 。 例如:10!!!=10*7*4*1;10!!=10*8*6*4*2。 下面输入n,k ,计算其值。 输入格式: 一个整数n(1≤n ≤1000),然后一个空格,然后是k 个叹号(1≤k ≤20)。 输出格式: 对应的超级阶乘的精确值。 输入输出样例: 3、线段包含(segments.cpp) 问题描述: 输入n 条线段L i ,当一条线段L 1的两个端点在另一条线段L 2的两个端点之内,则定义L 1完全被L 2包含,要求L 1和L 2的端点必须都不相同。如(-1,2)就被(-3,5)完全包含,而(-1,2)不能被(0,5)包含,也不能被(-1,5)包含。它的一个完全包含子集指的是k 条线段,这k 条线段可以排成一个序列P i (1≤i ≤k),对于每一个i(1

2014noip复赛模拟练习26

1. 设有一架天平,以及有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重≤1000g)。问题求解:要求输入a1 a2 a3 a4 a5 a6,表示1g砝码有a1个,2g砝码有a2个,......20g砝码有a6个,打印输出用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。 输入输出示例:Input : 1 1 0 0 0 0 ‘置0是false Output : Total = 3 (表示可以称出1g,2g,3g三种不同的重量) 2. 文科生的悲哀背景:化学不及格的Matrix67无奈选择了文科。他必须硬着头皮准备一次又一次的文科考试。在这一学期一共有n次文科考试,考试科目有4种,分别为政治、历史、地理和综合。每次考哪一科是不定的,因此在考试前Matrix67不知道应该去复习哪一科的功课。他希望能预测出下一次可能考的科目。于是,他收集到了以往的文科考试的资料。从以往的考试中,他发现了这样几个规律:1.如果这次考的是政治,那么下一次一定会考历史; 2.如果这次考的是综合,那么下一次一定会考地理; 3.如果这次考的是历史,那么下一次要么考政治,要么考地理; 4.如果这次考的是地理,那么下一次要么考历史,要么考综合。 Matrix67已经知道,本学期的第一次考试科目为政治。他打算拟定一个可以应对所有可能情况的应考复习计划。因此,他想知道,整个学期有多少种可能的考试科目安排满足以上规律。 输入格式Input Format 一个正整数n,代表本学期总的考试次数。 输入数据保证n<=10000。 输出格式Output Format 一个正整数,表示符合规律的科目安排方案的总数。 考虑到这个结果可能会很大,因此你只需要输出它mod 7654321的值即可。 3. 经过11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为0 时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。 【输入】输入文件名missile.in。第一行包含 4 个整数x1、y1、x2、y2,每两个整数之间用一个空格隔开,表示这两套导弹拦截系统的坐标分别为(x1, y1)、(x2, y2)。第二行包含1 个整数N,表示有N颗导弹。接下来N行,每行两个整数x、y,中间用一个空格隔开,表示一颗导弹的坐标(x, y)。不同导弹的坐标可能相同。 【输出】输出文件名missile.out。输出只有一行,包含一个整数,即当天的最小使用代价。【提示】两个点(x1, y1)、(x2, y2)之间距离的平方是(x1?x2)2+(y1?y2)2。两套系统工作半径r1、r2的平方和,是指r1、r2 分别取平方

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。允许输入一组数后立即输出对应的结果。样例输入:2 1 1 2 1 6 2 6 3 样例输出: 1 -1 var v,u,t,k,n,i:integer; begin readln(n); for i:=1 to n do begin readln(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、输入: 2 6 2 6 2 8 6 8 2 输出: -1

2、输入: 2 300 280 60 20 120 0 12 13 输出: 1 1 3、输入: 3 100 20 50 30 100 50 45 25 100 80 27 17 输出: -1 1 1 4、输入: 3 150 77 29 23 127 11 22 13 139 22 13 7 输出: 1 -1 -1 二、小球路程(文件名:xqlc.pas ) 已知小球从100米高度自由下落,落地后反弹起,又落地,又弹起,??。每次弹起的高度都是上一次高度的一半。求小球第n次反弹起的高度和球在整个过程所经过的路程(包括下落和反弹),用键盘输入n,输出反弹高度和经过路程,结果保留两位小数。 输入输出示例:输入:2 输出:25.00 225.00 var n,b:integer;s,h:real; begin readln(n); h:=100; for b:=1 to n do begin s:=s+h;

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

编程输入若干个字符串(以“?”号结束),找出并输出未在此串中出现的所有字母和数字(按ascii码顺序列出,区分大小写)。 输入:一行,一串字符,小于1000 000个。 输出:一行,未在字符串中出现的所有的字母和数字,按ascii码顺序、 var p,q:set of char; ch,i:char; begin assign(input,'agger.in'); reset(input); assign(output,'agger.out'); rewrite(output); p:=['0'..'9','A'..'Z','a'..'z']; q:=[]; read(ch); while ch<>'?' do begin q:=q+[ch]; read(ch); end; for i:='0' to '9' do if not(i in q) and (i in p) then write(i); for i:='A' to 'Z' do if not(i in q) and (i in p) then write(i); for i:='a' to 'z' do if not(i in q) and (i in p) then write(i); close(input); close(output); end. 或 var p:set of char; ch,i:char; begin assign(input,'agger.in'); reset(input); assign(output,'agger.out'); rewrite(output); p:=['0'..'9','A'..'Z','a'..'z']; read(ch); while ch<>'?' do

2014noip复赛模拟练习8

1. 几只兔子正在讨论谁跑得最快的问题。一个说:“我跑10米只用了4秒钟!够快吧?”另一个说:“我跑17米才用6秒还是我快!”旁边的一个说话了:“上次,有只狼赶我,我跑100米也只用了22秒钟!就是这样你一句我一句地争个不停,可是,谁也说服不了谁.一只灰兔说:“你们都别争啦。这样,把你们的名字和最好纪录都告诉我,我输入电脑,一下子就知道谁是最快的了。”然后,她就写了一个可以完成这个功能的程序。。。。。。作为一个出色的小学生,你是不是也可以完成这个程序呢?不要输给灰免啊。。。。。。 【输入文件】文件名:FAST。IN:文件第一行是一个整数n(1<=n<=100),表示参与讨论的兔子个数.后面3n行,每3行是一只兔子的信息,分别是名字<字符串,长度不超过10个字符),最好纪录的长度(整数,以米做单位,不超过1000),最好纪录的时间(整数,以秒做单位,不超过1000). 【输出文件】文件名:FAST.OUT:文件中只有一个字符串,就是跑得最快的那只兔子的名字.数据保证可以选出最快的唯一一只兔子. 【样例输入】3 Nikki 10 4 Snoy 17 6 Pimi 120 22【样例输出】Pimi 2. 婷婷是一个喜欢跳舞的女孩儿,还报了一个专门学习跳舞的班呢。在入学的时候,老师让大家根据自己的身高排了一下队,个子小的同学排前面,个子相同的同学,先后顺序随意。如果给你这些同学的身高数据,你能计算一下婷婷最前可以排第几、最后可以排第几么? 输入格式:文件第一行是一个整数n(1<=n<=30),表示跳舞班所有同学的人数。第二行是n整数,表示所有同学的身高,以厘米为单位。这n个同学的身高数据中,包括婷婷本人的。第三行是一个整数,表示婷婷的身高。 输出格式:文件中只有两个整数,用空格分开。分别表求:从前面数,婷婷可能排的最前的位置和最后的位置。 样例输入:8 133 134 132 133 131 130 138 133 133 样例输出:4 6 3. 某工厂一车间有M件产品,某中一件产品不合格,现在要找出来。只知道它的位置可以这样寻求:产品编号为1—M,从1开始数1,2,3,…,将数到K 的产品拿出来,然后继续数数1,2,3,…,数到K又将其取出,这样不断继续下去,数完后返回开头接着数,最后剩下的,就是所要找的不合格产品(凡被拿出来的产品,其位置,下次数时就跳过不再数)。请编写程序,找出不合格产品的编号。 数据输入:从文件chanpin.in中读入数据,文件中只有一行,为两个正整数M和K的值(M和K是小于10000的正整数)。

NOIP2014普级组复赛试题

CCF全国信息学奥林匹克联赛(NOIP2014)复赛 普及组 (请选手务必仔细阅读本页内容) •题目概况 •提交源程序文件名 三•编译命令(不包含任何优化开关) 注意事项: 1、文件名(程序名和输入输岀文件名)必须使用英文小写。 2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。 3、全国统一评测时采用的机器配置为:CPU AMD Athlo n( tm) 64x2 Dual Core CPU 5200+ , 2.71GHz,内存2G ,上述时限以此配置为准。 4、只提供Linux格式附加样例文件。 5、特别提醒:评测在当前最新公布的NOI Linux下进行,各语言的编译器版本以其为

准。 1. 珠心算测验 (cou nt.cpp/c/pas) 【问题描述】 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正 整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和? 最近老师出了一些测验题,请你帮忙求出答案。 【输入】 输入文件名为count.in。 输入共两行,第一行包含一个整数n,表示测试题中给岀的正整数个数。 第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给岀的正整数。 【输出】 输岀文件名为cou nt.out。输岀共一行,包含一 个整数,表示测验题答案。 【样例说明】 由1+2=3 ,1+3=4,故满足测试要求的答案为2。注意,加数和被加数必须是集合中的 两个不同的数。 【数据说明】 对于100%的数据,3 < n < 100,测验题给岀的正整数大小不超过10,000

NOIP2014普及组复赛试题 螺旋矩阵

NOIP2014普及组复赛试题解答 3. 螺旋矩阵 【问题描述】 一个n 行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1,2,3,…,n2,便构成了一个螺旋矩阵。 现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。 【分析】 这是个蛇形填数问题。如果采用先枚举二维数组再找对应的元素方法,由于1 ≤n ≤30,000,需要建立一个 30,000× 30,000的二维数组,结果会发生数据溢出且超出运行内存上限(128M)。 我们可以采用类似贪吃蛇的方法,让它在N×N个方格内自外向内逐格移动,控制其向右转的方向,并计算其长度。 解法一 #include using namespace std; bool pd(int,int) ; int i,j; bool p; int main() { int n,x,y,u,d,l,r,tot=0; // U为上边界,D为下边界,L为左边界,R为右边界; freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); scanf("%d%d%d",&n,&i,&j); d=n;r=n;u=1;l=1; //各边界赋初值; x=1;y=0; p=true; while((totl)&&p){--y;++tot;pd(x,y);}++l;//在下侧边界上向左移动,当下侧一行的结束时,控制其左边界向右缩一列; while((x>u+1)&&p){--x;++tot;pd(x,y);}++u;//在左侧边界上向上移动,当左侧一列的结束时,控制其上边界向下缩一行; } printf("%d\n",tot);

2014noip复赛模拟练习31

1. 数字反转(reverse.pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。(参见样例2) 【输入】输入文件名为reverse.in。输入共一行,一个整数n。 【输出】输出文件名为reverse.out。 输出共一行,一个整数,表示反转后的新数。 【输入输出样例1】 reverse.in reverse.out 123 321 【输入输出样例2】 reverse.in reverse.out -380 -83 【数据范围】 -1,000,000,000≤N≤1,000,000,000。 2. 查找“支撑数”【试题描述】在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗?每行输出5项。 【输入描述】 第一行为整数m,表示输入的整数个数。(3<= m <=100 ) 第二行为m个整数。 【输出描述】 若干个支撑数 【输入样例】 14 1 3 2 4 1 5 3 9 7 10 8 23 85 43 【输出样例】 3 4 5 9 10 85 3. 编程即将上课,为了能让每个同学都能拿到教材,老师让star去发教材,由于star比较内向,见到不认识的新同学你会害羞得什么话也不和他说,什么事情也不对他做,当然更不可能发书给他了。怎么办呢?老师的任务不能不完成啊!当然,遇到star认识的同学star还是很乐意交流的,于是star会要求他认识的同学继续帮他发书(不管对方认不认识他),star害羞的情绪也影响了其他所有同学,于是其他同学也只会发书给他认识的人。最后star要统计还有哪些同学没有拿到书,他就只能硬着头皮,顶着极大地心理压力给他们发书(老师的任务一定要完成啊)所有的学生都用学号来表示。 Input 第1行:三个数k,n,m(k代表你的学号,n代表人数,m代表关系数n(n<250)和m(m<10000) 第2..m+1行: 每行两个数a和b代表a认识b,(不代表b认识a)同一行的a,b不会相同

2014noip复赛模拟练习28

一、数字“4”和“7”是幸运数字,那么仅用幸运数字组成的整数就是幸运整数,请你帮助找出第k个幸运整数。输入k,输出第k个整数。 输入输出样例: 输入: 3 (k ≤ 30) 输出:44 二、小薇过生日请了许多朋友吃匹萨饼。但这些朋友太小吃不下完整的一个匹萨,不过他们都确切知道自己能吃的一份:1/4、1/2或3/4个匹萨,只有这三种可能。编写程序计算:满足这些小朋友要预定的最少的匹萨饼个数。 输入输出样例: 输入: 5 (共有5个小朋友)(小朋友个数≤100) 1/2 (第1个小朋友能吃1/2个匹萨饼) 1/4 (第2个小朋友能吃1/4个匹萨饼) 3/4 (第3个小朋友能吃3/4个匹萨饼) 1/4 (第4个小朋友能吃1/4个匹萨饼) 1/2 (第5个小朋友能吃1/2个匹萨饼) 输出: 3 (最少预定3个) 三、士兵排队问题:有N个士兵(1<=N<=100),编号依次为1,2,...,N.队列训练时,指挥官要把士兵从高到矮排成一行,但指挥官只知道“1 比2 高,7 比5高”这样的比较结果。 输入文件:第一行为数N(N〈=100);表示士兵的个数。以下若干行每行两个数A,B 表示A高于B。 输出文件:给出一个合法的排队序列。 四、看球的巴士描述:两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D。有一个例外,就是一辆车上的人全部都是一个球队的支持者。问要将这N个人全部送至球场,至少要几辆巴士。 输入格式Input Format 第一行是整数N和D,1<=N<=2500,1<=D<=N。 接下来的N行,按排队的顺序,描述每个人支持的球队,用H或J表示。 输出格式Output Format 至少要几辆巴士。 样例输入Sample Input 14 3 H J H H H J

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

喜羊羊运动会——训练时间 题目描述 这次运动会开幕式要进行团体操表演,于是喜羊羊召集大家紧锣密鼓地训练了起来,懒羊羊也在被召集之列。喜羊羊规定了每天的训练时间,只准早到,不许迟到,而且喜羊羊会做相关记录。这下懒羊羊可惨了,他虽然设定了闹钟,可是他动作慢,老迟到。现给出若干天的规定到场时间与懒羊羊的到场时间记录,判断每天懒羊羊有无及时赶到训练场,以及迟到或早到的时间。 输入 每两行时间为一组,每组中的第一行时间为规定的训练时间,第二行为懒羊羊到达训练场的时间。每行有两个整数H和M,H是以24小时记时法表示的小时数(0 <= H <= 24),M表示分钟数(0 <= M <= 59)。每组中的两个时间表示的是同一天的两个时间。若干组时间后以-1表示结束。 输出 若干行,如果这一天懒羊羊及时到达了训练场,则输出‘Yes’及早到的分钟数;如果没有及时到达,则输出‘No’及迟到的分钟数。 样例输入 14 30 14 25 8 0 9 0 13 10 12 50 7 25 7 25 -1 样例输出 Yes 5 No 60 Yes 20 Yes 0 提示 输入输出说明: 第一天第二天第三天第四天 规定训练时间14:30 8:00 13:10 7:25 到场时间14:25 9:00 12:50 7:25 有无及时到达Yes No Yes Yes 早到或迟到分钟数 5 60 20 0 程序段如下: var h1,n1,h2,n2,s1,s2:integer; begin read(h1); while h1<>-1 do

read(n1); s1:=h1*60+n1;//把时间从小时转化为分 read(h2); read(n2); s2:=h2*60+n2;//把时间从小时转化为分 if s2<=s1 then writeln('Yes',' ',s1-s2)//判断是否迟到,如果未迟到,则输出早到的时间else writeln('No',' ',s2-s1);//如果迟到则输出迟到的时间 read(h1); end; end. 输入15 20 18 30 12 19 12 10 14 30 14 30 8 50 8 42 -1输出No 190 Yes 9 Yes 0 Yes 8 输入9 30 9 32 11 30 12 30 12 10 11 59 14 30 14 30 8 50 8 42 -1 输出No 2 No 60 Yes 11 Yes 0 Yes 8 输入10 0 9 59 11 22 12 0 19 30 19 32

2014noip复赛模拟练习3

1.陶陶很喜欢数学,尤其喜欢奇怪的数。一天,他突然发现,有的整数拥有的因子数是很有个性的,决定找到一个具有n个正因子数的最小的正整数。 例如:n=4,则m=6,因为6有4个不同正整数因子1,2,3,6;而且是最小的有4个因子的整数。 【输入文件】仅一个数n(1≤n≤60) 【输出文件】仅一个数m 【样例输入】4 【样例输出】6 2.由文件给出n个1~30000的无序数正整数,其中1≤N≤10000,同一个正整数可能会出现多次,出现次数最多的整数称为众数,找出其中的众数及它出现的次数。输入格式:输入文件masses.in 第一行是正整数的个数N,第二行开始为N个正整数。输出格式:输出文件masses.out有若干行,每行两个数,第1个是众数,第2个是众数出现的次数。 样例输入:30 18 2 10 1 1 15 6 13 3 3 11 18 2 12 15 13 18 17 15 19 8 3 15 17 11 16 14 8 7 16 样例输出:15 4 3.在n个一连串的方格内填写字母A或B,但相邻两格内不能都填B。求所有可能的填写方案数。例如,当n=3,可能的方案有AAA、AAB、ABA、BAA、BAB等5种。输入N输出方案数。样例输入15 输出1597 4. 我们把t1,t2(包括t1, t2(1<=t1

NOIP普及组复赛模拟试题(一)

NOIP普及组复赛模拟试题一 PROBLEM 1:二进制字典排序字符串 (Filename:Seq.pas Inputfile:seq.in Outputfile:seq.out) [题目描述] 假设字符串的长度为N (0 < N < 44), 仅由0与1组成,没有二个1是相邻的。110就不是一个合法的,0101就是一个合法的四位的字符串,将它们按字典顺序排列下来,请问第K个(0 < K < 1000000000)字符串是哪一个,如果K的值超过的N位字符串的总个数,就输出-1。 [Input] 一行包含两个正整数N 和 K。 [Output] 相应的字符串或-1。 Sample input Output 3 1 000 PROBLEM 2: 非琐碎数 (Filename:Trivial.pas Inputfile:trivial.in Outputfile:trivial.out) [题目描述] 规定正整数的琐碎度为它的除了自身以外的所有约数的和除以它自己的值。如10的琐碎度为0.8=(1+2+5)/10, 20的琐碎度为1.1 = (1 + 2 + 4 + 5 + 10) / 20。 给你两个数 0 < I <= J < 1000000,找出满足 I <= N <= J 的 N,使 N 是琐碎度最小的整数。 [Input] 两个数 I 和J, 0 < I ≤ J ≤ 1000000。 [Output] 输出N。 Sample input output 24 28 25 PROBLEM 3:石头分堆 (Filename:Stone.pas Inputfile:stone.in Outputfile:stone.out) [题目描述] 你有一堆石头,重量为w[1],w[2]..w[n]。把他们分成两堆,使两堆重量的差最小。 [Input] 第一个数n(1<=n<=20)石头的个数。接下来n个数W1…Wn(1<=Wi<=100000)石头的重量。数字间用空格分割。[Output] 两堆重量的差的最小值。 Sample input output 5

NOIP2014提高组复赛试题

全国信息学奥林匹克联赛(2014)复赛 提高组1 1.生活大爆炸版石头剪刀布 () 【问题描述】 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游 戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主角之一。 蜥蜴人:《星际迷航》中的反面角色。 这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。 表一石头剪刀布升级版胜负关系 剪刀石头布蜥蜴人斯波克 甲对乙的甲 '结果 剪刀平输赢赢输 石头平输赢输 布平输赢蜥蜴人平赢 斯波克平 现在,小A和小B尝试玩这种升级版的猜拳游戏。已知他们 的出拳都是有周期性规律的,但周期长度不一定相等。例如:如

果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为6的周期出拳,那么他的出拳序列就是“石头- 布- 石头- 剪刀- 蜥蜴人- 斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-……”,而如果小B 以“剪刀-石头-布-斯波克-蜥蜴人”长度为5的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头- 布-斯波克-蜥蜴人-……” 已知小A和小B一共进行N次猜拳。每一次赢的人得1分,输的得0 分;平局两人都得0 分。现请你统计N 次猜拳结束之后两人的得分。 【输入】 输入文件名为。 第一行包含三个整数:N,,,分别表示共进行N次猜拳、小A出拳的周期长度,小B出拳的周期长度。数与数之间以一个空格分隔。 第二行包含个整数,表示小A出拳的规律,第三行包含个整数,表示小B出拳的规律。其中,0表示“剪刀” ,1表示“石头”, 2表示“布”,3 表示“蜥蜴人” , 4 表示“斯波克”。数与数之 间以一个空格分隔。 【输出】 输出文件名为。 输出一行,包含两个整数,以一个空格分隔,分别表示小 A、小B的得分。 【输入输出样例1】

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

被7整除描述Description 要求输出从1到n(1<=n<=10^6),有多少个整数n,满足2^n-n^2能被7整除 输入格式Input Format 一个数n 输出格式Output Format 一个数,即满足的个数 样例输入 2 样例输出 1 n: 1 2 3 4 5 6 7 8 9 10 11 12 2^n: 2 4 8 16 32 64 128 256 512 1024 2048 4096 (2^n) mod 7: 1 2 4 1 2 4 1 2 412 4 n^2: 1 4 9 16 25 36 49 64 81 100 121 144 (n^2) mod 7: 1 4 2 2 4 1 0 1 422 4 (2^n) mod 7的周期为3 {2,4,1} (n^2) mod 7的周期为7 {1,4,2,2,4,1,0} 所以(2^n-n^2) mod 7周期为21: {2,4,1,2,4,1,2,4,1,2,4,1,2,4,1,2,4,1,2,4,1}- {1,4,2,2,4,1,0,1,4,2,2,4,1,0,1,4,2,2,4,1,0}= {1,0,6,0,0,0,2,3,4,0,2,4,1,4,0,5,2,6,5,3,1} program p1116; const num:array[0..21] of integer= (0,0,1,1,2,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6); var n,k,q,ans:longint; begin readln(n); k:=n div 21; q:=n mod 21; ans:=k*6+num[q]; writeln(ans); end. 5768(1649)50000(14286)1000000 (285714) 在A、B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数<=20,且每条路段上的距离均为一个整数)。 A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路段,…最后到达B。通路上路段距离之和称为通路距离(最大距离<=1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。

noip普及组复赛模拟试题34(附答案)

1.近来见习魔法师们在进行一项有关二进制数的研究,研究涉及的一个统计问题令他们大伤脑筋。问题是这样的:若将一个正整数化为二进制数,在此二进制数中,我们将数字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类数; 程序要求:求出X~Y之中,全部A、B两类数的个数。 样例输入10 20 输出 5 6 Var X,Y,i,j,la,lb:longint; procedure ze(m:longint); var l0,l1:longint; begin l0:=0;l1:=0; while m<>0 do begin if m mod 2=0 then l0:=l0+1 else l1:=l1+1; m:=m div 2;end; if l1>l0 then j:=1 else j:=0; end; begin la:=0;lb:=0; readln(x,y); for i:=x to y do begin ze(i); if j=1 then la:=la+1 else if j=0 then lb:=lb+1; end; writeln(la);writeln(lb); end. 输入50 100 输出28 23 输入200 400 输出110 91 输入1000 2000输出615 386 输入40000 50000 输出4818 5183 老师给笑笑布置了一份作业,笑笑不知如何解决。老师给了一串很长的数列,要求从中找出连续的一段来使的总和最大。 【输入文件】: 第一行包含一个整数n,表示数列的长度。(n<=100000) 第二行包含n个整数来描述这个数列,每个整数的的绝对值不超过1000。 【文件输出】: 文件中只有一个整数,为最大的连续段总和。 【输入样例】: 5 1 - 2 3 1 -4 【输出样例】 4 var s:array[1..10000] of longint; n,ii,t,ans:longint;

noip2014普及组复赛题解

1.珠心算测验 注意看清题意:其中有多少个数,恰好等于集合中另外两个(不同 的)数之和。这样的题意加上100的规模,建议暴力3个for: #include #include #include #include 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 #include #include 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){

相关主题