NOIP普及组复赛习题源程序
NOIP2011普及组复赛(精彩试题+源程序)
NOIP2011 普及组复赛1.数字反转(reverse.cpp/c/pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。
新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。
(参见样例2)【输入】输入文件名为reverse.in。
输入共一行,一个整数N。
【输出】输出文件名为reverse.out。
输出共1行,一个整数,表示反转后的新数。
-1,000,000,000≤N≤1,000,000,000。
【解题】这道题非常简单,可以读字符串处理,也可以读数字来处理,只不过要注意符号问题(以及-0,但测试数据没出)。
【法一】字符串处理Var i,l,k:integer;s:string;p:boolean;beginassign(input, 'reverse.in'); reset(input);assign(output, 'reverse.out'); rewrite(output);readln(s);l:=length(s);k:=1;if s[1]='-' thenbeginwrite('-');k:=2;end;p:=true;;for i:=l downto k dobeginif(p)and((s[i]='0')) then continueelsebeginwrite(s[i]);p:=false;;end;end;close(input); close(output);end.【法二】数字处理Var f:integer;n,ans:longint;beginassign(input, 'reverse.in'); reset(input);assign(output, 'reverse.out'); rewrite(output);readln(n);if n<0 thenbeginf:=-1;n:=-n;endelsef:=1;ans:=0;while n<>0 dobeginans:=ans*10+n mod 10;n:=n div 10;end;ans:=ans*f;writeln(ans);close(input); close(output);end.2.统计单词数(stat.pas/c/cpp)【问题描述】一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
NOIP2005普及组复赛试题(附题解)
noip2005xx组解题报告xx摘苹果【文件名】:apple.pas/c/cpp【问题描述】陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。
苹果成熟的时候,陶陶就会跑去摘苹果。
陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。
假设她碰到苹果,苹果就会掉下来。
【输入文件】输入文件apple.in包括两行数据。
第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。
第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
【输出文件】输出文件apple.out包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
【样例输入】100 200 150 140 129 134 167 198 200 111110【样例输出】5分析:拿到这道题,我觉得还是比较简单的。
由于数据范围都不超过200,用integer完全就足够了,具体步骤如下:1.读入2.循环1 to 103.判断,找出最优解4.输出【程序清单】program apple;vari,n,s:integer;a:array[1..10] of integer;beginassign(input,'apple.in');reset(input);for i:=1 to 10 do read(a[i]);read(n);s:=0; for i:=1 to 10 doif n+30>=a[i] then s:=s+1;close(input);assign(output,'apple.out');rewrite(output);write(s);close(output);end.校门外的树【文件名】tree.pas/c/cpp【问题描述】某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。
最新NOIP复赛普及组试题资料
全国信息学奥林匹克联赛(NOIP2011)复赛普及组(请选手务必仔细阅读本页内容)一.题目概况二.提交源程序文件名三.编译命令(不包含任何优化开关)四.运行内存限制注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU P4 3.0GHz,内存1G,上述时限以此配置为准。
4、特别提醒:评测在NOI Linux 下进行。
1.数字反转(reverse.cpp/c/pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。
新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
【输入】输入文件名为reverse.in。
输入共1 行,一个整数N。
【输出】输出文件名为reverse.out。
输出共1 行,一个整数,表示反转后的新数。
【输入输出样例1】【输入输出样例2】【数据范围】-1,000,000,000 ≤ N ≤ 1,000,000,000。
2.统计单词数(stat.cpp/c/pas)【问题描述】一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。
注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
【输入】输入文件名为stat.in,2 行。
第1 行为一个字符串,其中只含字母,表示给定单词;第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
【输出】输出文件名为stat.out。
NOIP2010普及组复赛试题
全国信息学奥林匹克联赛(NOIP2010)复赛普及组(请选手务必仔细阅读本页内容)一.题目概览中文题目名称数字统计接水问题导弹拦截三国游戏英文题目名称two water missile sanguo可执行文件名two water missile sanguo 输入文件名two.in water.in missile.in sanguo.in 输出文件名two.out water.out missile.out sanguo.out每个测试点时限1秒1秒1秒1秒测试点数目10 10 10 10每个测试点分值10 10 10 10 比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统传统二.提交源程序文件名对于pascal语言two.pas water.pas missile.pas sanguo.pas 对于C语言two.c water.c missilel.c sanguo.c 对于C++语言two.cpp water.cpp missile.cpp sanguo.cpp 三.编译命令(不包含任何优化开关)对于pascal语言fpc two.pas fpc water.pas fpc missile.pas fpc sanguo.pas对于C语言gcc –o twoTwo.c -lm gcc –o waterwater.c -lmgcc –o missileball.c -lmgcc –o sanguosanguo.c -lm对于C++语言g++ –o twotwo.cpp -lmg++ –o seatwater.cpp -lmg++ –o missilemissile.cpp -lmg++ –o sanguosanguo.cpp -lm四.运行内存限制运行内存上限128M 128M 128M 128M注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
NOIP2015复赛普及组精彩试题
CCF 全国信息学奥林匹克联赛(NOIP2015)复赛普及组(请选手务必仔细阅读本页内容)一.题目概况二.提交源程序文件名三.编译命令(不包含任何优化开关)注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor,2.8GHz,内存 4G,上述时限以此配置为准。
4、只提供 Linux 格式附加样例文件。
5、特别提醒:评测在当前最新公布的NOI Linux 下进行,各语言的编译器版本以其为准。
1. 金币(coin.cpp/c/pas)国王将金币作为工资,发放给忠诚的骑士。
第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1天里,每天收到 N+1 枚金币。
请计算在前 K 天里,骑士一共获得了多少金币。
【输入格式】输入文件名为 coin.in。
输入文件只有 1 行,包含一个正整数 K,表示发放金币的天数。
【输出格式】输出文件名为 coin.out。
输出文件只有 1 行,包含一个正整数,即骑士收到的金币数。
【输入输出样例 1】【输入输出样例 1 说明】骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。
因此一共收到 1+2+2+3+3+3=14 枚金币。
【输入输出样例 2】【数据说明】对于 100%的数据,1 ≤ K ≤ 10,000。
2.扫雷游戏(mine.cpp/c/pas)扫雷游戏是一款十分经典的单机小游戏。
在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
NOIP2011普及组复赛试题
1 ≤ 单词长度 ≤ 10。 1 ≤ 文章长度 ≤ 1,000,000。
3.瑞士轮
(swiss.cpp/c/pas) 【背景】
在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和 循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公 平,偶然性较低,但比赛过程往往十分冗长。
选手、R 轮比赛,以及我们关心的名次 Q。 第二行是 2*N 个非负整数 s1, s2, …, s2N,每两个数之间用一个空格隔开,其中 si 表示编
号为 i 的选手的初始分数。 第三行是 2*N 个正整数 w1, w2, …, w2N,每两个数之间用一个空格隔开,其中 wi 表示编
号为 i 的选手的实力值。
(’、’)’是左右括号,’+’、’*’分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序
给出了给定表达式中除去变量外的运算符和括号。 【输出】
输出文件 exp.out 共 1 行。包含一个整数,即所有的方案数。注意:这个数可能会很大, 请输出方案数对 10007 取模后的结果。
【输入输出样例 1】 exp.in 4 +(*)
三.编译命令(不包含任何优化开关)
对于 C++语言 g++ -o reverse g++ -o stat
reverse.cpp -lm stat.cpp -lm
对于 C 语言
gcc -o reverse gcc -o stat
reverse.c -lm
stat.c -lm
对于 pascal 语言 fpc reverse.pas fpc stat.pas
①—④ ②—③
少儿编程NOIP2016年普及组复赛试题
第22届全国青少年信息学奥林匹克联赛CCF-NOIP-2016普及组(复赛)竞赛时间:2016年11月19日14:30〜18:00注意事项:1.文件名(程序名和输入输出文件名)必须使用英文小写。
2.除非特殊说明,结果比较方式均为忽略行末空格及文末回车的全文比较。
3.C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
4.全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor, 2.8GHz,内存4G,上述时限以此配置为准。
5.只提供Linux格式附加样例文件。
6.评测在NOI Linux下进行。
7.编译时不打开任何优化选项。
买铅笔(pencil)【问题描述】P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。
她发现商店一共有3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。
为了公平起见,P老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。
【输入格式】从文i^pencil.in中读入数据。
输入的第一行包含一个正整数n,表示需要的铅笔数量。
接下来三行,每行用两个正整数描述一种包装的铅笔:其中第一个整数表示这种包装内铅笔的数量,第二个整数表示这种包装的价格。
保证所有的7个数都是不超过10000的正整数。
【输出格式】输出到文i^pencil.out中。
输出一行一个整数,表示P老师最少需要花费的钱。
【样例1输入】572 250 3030 27【样例1输出】54【样例1说明】铅笔的三种包装分别是:•2支装,价格为2 ;•50支装,价格为30 ;•30支装,价格为27 -P老师需要购买至少57支铅笔。
如果她选择购买第一种包装,那么她需要购买29份,共计2 x 29 = 58支,需要花费的钱为2 x 29 = 58 -实际上,P老师会选择购买第三种包装,这样需要买2份。
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复赛普及组模拟题8
1.句子的第一个字母用了小写。 2.不是单词的第一个字母用了大写。 一个单词是字母的序列,不包含其他任何字符,或行尾结束符用句号,问号 或叹号表示句子的结束。
全国信息学奥林匹克联赛复赛
普及组
模拟赛
题目名称 程序名称 输入输出 时间限制 空间限制
跑步 run.pas In/out 1S 128MB
拼写检查 spell.pas In/out 1S 128MB
魅力俱乐部 难解的问题
club.pas
problem.pas
In/out
In/out
1S
1S
128MB
【输入】 输入为文字包含大小写字母(A-Z,a 一 z)、标点符号(.!?)、空格。文字长 度不超过 10000 【输出】 输出文字中错误的数量 【样例输入】
This sentence iz correkt! -It Hasቤተ መጻሕፍቲ ባይዱNo mista;.Kes et oll. But there are two BIG mistakes in this one! and here is one more. [样例输出] 3
4.难解的问题 【描述】 在你的帮助下,蔚蓝来到了埃及,在金字塔里,蔚蓝看到了一个问题,传说,能 回答出这个 问题的人就能受到埃及法老的祝福,可是蔚蓝日夜奋战,还是想不出来,你能帮 帮他么? 问题是这 样的:
给定一个序列<a1,a2,...,an>.求最长上升子序列(lis)p1<p2<...<pw 满足 a[p1]<a[p2]<...<a[pw], 例如 65 158 170 299 300 155 207 389 LIS=<65,158,170,299,300,389>。 但是,现在还有一个附加条件:求出的最长上升子序列必须含有第 K 项。比如, 在上面的例子中, 要求求出的最长上升子序列必须含有第 6 项,那么最长上升子序列就是:65 155 207 389。 【输入格式】 第一行是用空格隔开的两个正整数 N、K,含义同上所述. 第二行 N 个数,即给出的序列. 【输出格式】 仅有一个数,表示含有第 K 项的最长上升子序列的长度. 【时间限制】 各个测试点 1s 【注释】 对于 60%的数据,N<=10000; 对于 100%的数据,1<=n<=300000 ,1<=k<=n,序列的每一个数为小于 2^31-1 的非 负整数. 【样例输入】 53 12321 【样例输出】 3
NOIP2012普及组复赛试题
CCF全国信息学奥林匹克联赛(NOIP2012)复赛普及组(请选手务必仔细阅读本页内容)一.题目概况二.提交源程序文件名三.编译命令(不包含任何优化开关)四.运行内存限制注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU Intel Core2 Quad Q8200 2.33GHz,内存2G,上述时限以此配置为准。
4、特别提醒:评测在NOI Linux下进行。
1.质因数分解(prime.cpp/c/pas)【问题描述】已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
【输入】输入文件名为prime.in。
输入只有一行,包含一个正整数n。
【输出】输出文件名为prime.out。
输出只有一行,包含一个正整数p,即较大的那个质数。
【输入输出样例】【数据范围】对于60%的数据,6 ≤ n ≤ 1000。
对于100%的数据,6 ≤ n ≤ 2*109。
2.寻宝(treasure.cpp/c/pas)【问题描述】传说很遥远的藏宝楼顶层藏着诱人的宝藏。
小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。
说明书的内容如下:藏宝楼共有N+1 层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。
除了顶层外,藏宝楼另有N 层,每层M 个房间,这M 个房间围成一圈并按逆时针方向依次编号为0,…,M-1。
其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。
每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x 个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k 号房间。
比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第 2 个有楼梯的房间,从该房间上楼。
如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。
noip普及组复赛入门训练1
PASCAL复习21. 字符统计(文件名ZFTJ.PAS)读入一组字符,以“?”作为结束标志,统计其中元音字母、辅音字母、数字和其它符号个数(“?”作为结束标志,不计算个数)。
如输入字符为SouA56#s?,则输出YY=3,FY=2,SZ=2,QT=1。
输入输出样例:输入:SouA56#sEenTk3&?输出:YY=5,FY=5,SZ=3,QT=22.取数(QS.PAS)问题描述:我们来玩一个游戏:自然数1到N,按顺序列成一排,你可以从中取走任意个数,但是相邻的两个不可以同时被取走。
如果你能算出一共有多少种取法,那么你会被天神Lijiganjun奖励。
输入格式:输入一个自然数n(1< n < 50)。
输出格式:多少种取法。
输入输出样例:输入:5↙输入:10输出:13 输出:1443. 网袋重量(WDZL.PAS)小明有一个能装N公斤物品的网袋。
现有大白菜A一棵重5公斤,猪肉B 一块2公斤,鱼C一条3。
5公斤,酱油D连瓶1。
7公斤,白糖E一袋1公斤,菜油F一桶5。
1公斤,设计一程序,使小明的网袋所装的重量最大。
输入N重量,输出最大重量和所装物品。
输入输出样例:输入:12↙输入:15输出:11.80 输出:14.80A D F AB D E F4. 连续数和(LXSH.PAS)若干个连续自然数之和是1136,输出这些自然数,统计这些自然数中数字3的个数有多少个?输入输出样例:20 21 22 23 24 …… 50 51 GS=135.类型数(文件名LXS.PAS)若将一个正整数化为四进制数,在此四进制数中,我们将数字2和3的个数多于数字0和1的个数的这类四进制数称为A类数,否则就称其为B类数。
例如:(33)10=(201)4其中1的个数为1,0的个数为1,1和0的个数为2,而2的个数为1<2,则称此数为B类数;(56)10=(320)4其中3和2的个数为2,0的个数1为,称此数为A类数;读入一个十进制数N,输出对应的类型。
NOIP2004普及组复赛试题
martian.cpp martian.c
martian.pas
三.编译命令(不包含任何优化开关) 对于 C++语言 g++ -o unhappy g++ -o peanuts
unhappy.cpp -lm peanuts.cpp -lm 对于 C 语言 gcc -o unhappy gcc -o peanuts
述时限以此配置为准。 4、特别提醒:评测在 NOI Linux 下进行。
1、不高兴的津津(unhappy.pas/c/cpp)
【问题描述】
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为 她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天 上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高 兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周 她会不会不高兴;如果会的话,哪天最不高兴。
【输入文件】
输入文件 fbi.in 的第一行是一个整数 N(0 <= N <= 10),第二行是一个长度为 2N 的“01” 串。
【输出文件】 输出文件 fbi.out 包括一行,这一行只包含一个字符串,即 FBI 树的后序遍历序列。 【样例输入】
3
10001011 【样例输出】
IBFBBBFI BFIIIFF 【数据规模】 对于 40%的数据,N <= 2;
火星人用一种非常简单的方式来表示数字——掰手指。火星人只有一只手,但这只手上有成 千上万的手指,这些手指排成一列,分别编号为 1,2,3„„。火星人的任意两根手指都能 随意交换位置,他们就是通过这方法计数的。
noip复赛普及组试题
CCF 全国信息学奥林匹克联赛(NOIP2015)复赛普及组(请选手务必仔细阅读本页内容)一.题目概况1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。
3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor,,内存4G,上述时限以此配置为准。
4、只提供 Linux 格式附加样例文件。
5、特别提醒:评测在当前最新公布的NOI Linux 下进行,各语言的编译器版本以其为准。
1. 金币c/pas)国王将金币作为工资,发放给忠诚的骑士。
第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币。
请计算在前 K 天里,骑士一共获得了多少金币。
【输入格式】输入文件名为。
输入文件只有 1 行,包含一个正整数 K,表示发放金币的天数。
【输出格式】输出文件名为。
输出文件只有 1 行,包含一个正整数,即骑士收到的金币数。
【输入输出样例 1】【输入输出样例 1 说明】骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。
因此一共收到 1+2+2+3+3+3=14 枚金币。
【输入输出样例 2】【数据说明】对于 100%的数据,1 ≤ K ≤ 10,000。
2.扫雷游戏(c/pas)扫雷游戏是一款十分经典的单机小游戏。
在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。
NOIP2017_普及组复赛试题
CCF全国信息学奥林匹克联赛(NOIP2017)复赛普及组(请选手务必仔细阅读本页内容)注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor,2.8GHz,内存4G,上述时限以此配置为准。
4、只提供Linux格式附加样例文件。
5、提交的程序代码文件的放置位置请参照各省的具体要求。
6、特别提醒:评测在当前最新公布的NOI Linux下进行,各语言的编译器版本以其为准。
1. 成绩(score.cpp/c/pas)【问题描述】牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是:总成绩=作业成绩×20%+小测成绩×30%+期末考试成绩×50%牛牛想知道,这门课程自己最终能得到多少分。
【输入格式】输入文件名为score.in。
输入文件只有1行,包含三个非负整数A、B、C,分别表示牛牛的作业成绩、小测成绩和期末考试成绩。
相邻两个数之间用一个空格隔开,三项成绩满分都是100分。
【输出格式】输出文件名为score.out。
输出文件只有1行,包含一个整数,即牛牛这门课程的总成绩,满分也是100分。
见选手目录下的score/score1.in和score/score1.ans。
【输入输出样例1说明】牛牛的作业成绩是100分,小测成绩是100分,期末考试成绩是80分,总成绩是100×20%+100×30%+80×50%=20+30+40=90。
【输入输出样例2说明】牛牛的作业成绩是60分,小测成绩是90分,期末考试成绩是80分,总成绩是60×20%+90×30%+80×50%=12+27+40=79。
【数据说明】对于30%的数据,A=B=0。
NOIP2008普及组复赛试题
全国信息学奥林匹克联赛(NOIP2008)复赛普及组一.题目概览中文题目名称ISBN号码排座椅传球游戏立体图英文题目名称isbn seat ball drawing可执行文件名isbn seat ball drawing输入文件名isbn.in seat.in ball.in drawing.in输出文件名isbn.out seat.out ball.out drawing.out每个测试点时限1秒1秒1秒1秒测试点数目10 10 10 10每个测试点分值10 10 10 10比较方式全文比较全文比较全文比较全文比较题目类型传统传统传统传统二.提交源程序文件名对于pascal语言isbn.pas seat.pas ball.pas drawing.pas对于C语言isbn.c seat.c ball.c drawing.c对于C++语言isbn.cpp seat.cpp ball.cpp drawing.cpp三.编译命令(不包含任何优化开关)对于pascal语言fpc isbn.pas fpc seat.pas fpc ball.pas fpc drawing.pas对于C语言gcc –o isbnisbn.c gcc –o seatseat.c gcc –o ballball.c gcc –o drawingdrawing.c对于C++语言g++ –o isbnisbn.cpp g++ –o seatseat.cpp g++ –o ballball.cpp g++ –odrawingdrawing.cpp四.运行内存限制运行内存上限50M 50M 50M 50M注意事项:1、文件名(程序名和输入输出文件名)必须使用小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存512M,上述时限以此配置为准。
NOIP2006普及组复赛试题(附题解)
NOIP2006普及组解题报告Kyd Dong 1.明明的随机数(random.pas/c/cpp)【问题描述】明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。
然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
请你协助明明完成“去重”与“排序”的工作。
【输入文件】输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数:N第2行有N个用空格隔开的正整数,为所产生的随机数。
【输出文件】输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。
第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
【输入样例】1020 40 32 67 40 20 89 300 400 15【输出样例】815 20 32 40 67 89 300 400【试题分析】简单的映射排序,用一个数组s[1..n]用一个数组a[1..1000]来储存状况,先清空数组为0,在读入s[i]之后,先判断a[s[i]]是否为1,是则再读下一个数据,不是则把a[s[i]]赋值为1,m←m+1。
在输出时,则先输出m,再用一个循环输出各个值,即用如下伪代码:For i←1 to 1000 do{If a[i]=1Then 打印i;}当然还有许多不同的方法,这里只给出代码,供读者自己研究。
【程序代码】1.program random; {映射排序}varp:array [1..1000] of shortint; {当前数已有标记1} n,l:shortint;a,max,i:integer;input,output:text;beginassign(input,'random.in');assign(output,'random.out');reset(input);readln(input,n);fillchar(p,sizeof(p),0);max:=-1;l:=0; {max:存最大数, l:不同数字的个数}for i:=1 to n dobeginread(input,a);if p[a]=0 then begin p[a]:=1;l:=l+1 end; {当前数未重复,则标记并记数}if a>max then max:=a;end;rewrite(output);writeln(output,l);for i:=1 to max doif p[i]=1 then write(output,i,' ');close(input);close(output);end2.program random; { 插入排序}var p:array [1..1000] of boolean;a:array [1..100] of integer;i,n,j,g:integer;input,output:text;procedure swap(var a,b:integer);var c:integer;beginc:=a;a:=b;b:=c;end;beginassign(input,'random.in');assign(output,'random.out');reset(input);readln(input,n);fillchar(p,sizeof(p),false);g:=2;read(input,a[1]);p[a[1]]:=true;for i:=2 to n dobeginread(input,a[g]);if p[a[g]]=falsethenbeginp[a[g]]:=true; {当前数已有标记}j:=g; {插入排序}while j>1 dobeginif a[j]<a[j-1] then swap(a[j-1],a[j]); j:=j-1;end;g:=g+1;end;end;rewrite(output);writeln(output,g-1);for i:=1 to g-1 do write(output,a[i],' ');close(output);close(input);end.3.program random; { 插入排序}var a:array [1..100] of integer;i,j,k,l,n,g:integer;input,output:text;beginassign(input,'random.in');assign(output,'random.out');reset(input);readln(input,n);g:=1;read(input,a[1]);for i:=2 to n dobeginread(input,k);j:=1;while (k>a[j]) and (j<=g) do j:=j+1; {找插入位置} if k<a[j] then {中间插入} beging:=g+1;for l:=g downto j+1 do a[l]:=a[l-1];a[j]:=k;end;if j>g then begin g:=g+1;a[g]:=k end; {最后插入} end;rewrite(output);writeln(output,g);for i:=1 to g-1 do write(output,a[i],' ');writeln(output,a[g]);close(output);close(input);end.4.program random; { 链表插入排序}typelink=^node;node=recorddata:integer;next:link;end;var h,t,r,s:link;i,g,n,k:integer;input,output:text;beginassign(input,'random.in');assign(output,'random.out');reset(input);readln(input,n);g:=1;new(t);read(input,t^.data);t^.next:=nil;h:=t; {用第一个数建立链首指针}for i:=2 to n do {插入其余的数}beginread(input,k);if k<h^.data thenbegin new(t);t^.data:=k;t^.next:=h;h:=t;g:=g+1 end{链首插入}elsebeginr:=h;while (k>r^.data) and (r^.next<>nil) do begins:=r;r:=r^.next end; {在链中查找插入位置}if k<r^.data thenbeginnew(t);t^.data:=k;s^.next:=t;t^.next:=r;g:=g+1 end {处理在链中插入}else if (k<>r^.data) and (r^.next=nil) thenbeginnew(t);t^.data:=k;r^.next:=t;t^.next:=nil;g:=g+1 end {处理在链尾插入}end;end;rewrite(output);writeln(output,g);repeatwrite(output,r^.data,' ');r:=r^.next;until r=nil;close(output);close(input);end.5.program random; { 树排序}var a:array [1..100,1..3] of integer;i,n,g:integer;input,output:text;procedure px(s:integer); {建树,s:树中当前结点,i:待插入点}beginif a[i,2]<a[s,2] then if a[s,1]=0 then begin a[s,1]:=i;g:=g+1 end {插入左子树}else begin s:=a[s,1];px(s) end;if a[i,2]>a[s,2] then if a[s,3]=0 then begin a[s,3]:=i;g:=g+1 end {插入右子树}else begin s:=a[s,3];px(s) end;end;procedure print(s:integer); {中序遍历}beginif a[s,1]<>0 then print(a[s,1]); {左子树不空,则递归} write(output,a[s,2],' '); {输出当前父结点}if a[s,3]<>0 then print(a[s,3]); {右子树不空,则递归} end;beginassign(input,'random.in');assign(output,'random.out');reset(input);readln(input,n);fillchar(a,sizeof(a),0);read(input,a[g,2]);for i:=2 to n do begin read(input,a[i,2]);px(1) end; {建排序二叉树}rewrite(output);writeln(output,g);print(1);close(output);close(input);end.2.开心的金明(happy.pas/c/cpp)【问题描述】金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。
noip复赛普及组试题
CCF 全国信息学奥林匹克联赛〔NOIP2021 〕复赛普及组〔请选手务必仔细阅读本页内容〕一.题目大要中文题目名称金币扫雷游戏求和销售员英文题目与子目录名coin mine sum salesman 可执行文件名coin mine sum salesman 输入文件名输出文件名每个测试点时限 1 秒 1 秒 1 秒 1 秒测试点数量10101010每个测试点分值10101010附加样例文件有有有有结果比较方式全文比较〔过滤行末空格及文末回车〕题目种类传统传统传统传统运行内存上限128M128M128M128M 二.提交源程前言件名对于 C++语言对于C语言对于 pascal语言三.编译命令〔不包括任何优化开关〕对于 C++语言g++ -o coin -g++ -o mine -g++ -o sum -g++ -o salesmanlm lm lm-lm 对于C语言gcc -o coin gcc -o mine gcc -o sum gcc -o salesman-lm-lm-lm-lm对于 pascal语言fpc fpc fpc fpc 本卷须知:1、文件名〔程序名和输入输出文件名〕必定使用英文小写。
2、 C/C++中函数 main()的返回值种类必定是int,程序正常结束时的返回值必定是3、全国一致评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor4G,上述时限以此配置为准。
0 。
,,内存4、只供应 Linux格式附加样例文件。
5、特别提示:评测在当前最新宣告的NOI Linux下进行,各语言的编译器版本以其为准。
1.金币c/pas)国王将金作工,放忠的士。
第一天,士收到一枚金;此后两天〔第二天和第三天〕,每天收到两枚金;此后三天〔第四、五、六天〕,每天收到三枚金;此后四天〔第七、八、九、十天〕,每天收到四枚金⋯⋯;种工放模式会素来延下去:当 N 天每天收到 N 枚金后,士会在此后的 N+1 天里,每天收到 N+1 枚金。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
N O I P2011普及组复赛1.数字反转(reverse.cpp/c/pas)【问题描述】给定一个整数,请将该数各个位上数字反转得到一个新数。
新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。
(参见样例2)【输入】输入文件名为reverse.in。
输入共一行,一个整数N。
【输出】输出文件名为reverse.out。
输出共1行,一个整数,表示反转后的新数。
-1,000,000,000≤N≤1,000,000,000。
【解题】这道题非常简单,可以读字符串处理,也可以读数字来处理,只不过要注意符号问题(以及-0,但测试数据没出)。
【法一】字符串处理Vari,l,k:integer;s:string;p:boolean;beginassign(input,'reverse.in');reset(input);assign(output,'reverse.out');rewrite(output);readln(s);l:=length(s);k:=1;ifs[1]='-'thenbeginwrite('-');k:=2;end;p:=true;;fori:=ldowntokdobeginif(p)and((s[i]='0'))thencontinueelsebeginwrite(s[i]);p:=false;;end;end;close(input);close(output);end.【法二】数字处理Varf:integer;n,ans:longint;beginassign(input,'reverse.in');reset(input);assign(output,'reverse.out');rewrite(output);readln(n);ifn<0thenbeginf:=-1;n:=-n;endelsef:=1;ans:=0;whilen<>0dobeginans:=ans*10+nmod10;n:=ndiv10;end;ans:=ans*f;writeln(ans);close(input);close(output);end.2.统计单词数(stat.pas/c/cpp)【问题描述】一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。
注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)【输入】输入文件名为stat.in,2行。
第1行为一个字符串,其中只含字母,表示给定单词;第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
【输出】输出文件名为stat.out。
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
输出结果表示给定的单词To在文章中出现两次,第一次出现的位置为0。
表示给定的单词to在文章中没有出现,输出整数-1。
【数据范围】1≤单词长度≤10。
1≤文章长度≤1,000,000。
【解题】这道题也不是很难,programstat;varI,n,p:longint;s,s1:string;c:char;beginassign(input,'stat.in');reset(input);assign(output,'stat.out');rewrite(output);readln(s);s:=upcase(s);//函数upcase()参数可为char,也可为stringi:=-1;//i统计读入的字符位置,首个字符出现的位置是0s1:='';//s1累加读入的字符n:=0;//n统计出现次数p:=-1;//p标记第一次出现的位置repeatread(c);c:=upcase(c);//统一大小写i:=i+1;ifc=''then//遇到空格,匹配是否相同beginifs=s1thenbeginn:=n+1;ifp=-1then//p标记第一次出现的位置,如果p是第一次更改,记录位置p:=i-length(s);end;s1:='';endelses1:=s1+c;//不是空格,继续叠加untileoln(input);ifs1=sthen//处理最后一个单词是否相同的情况beginn:=n+1;ifp=-1thenp:=i-length(s)+1;//最后没有空格end;ifn=0thenwriteln(-1)elsewriteln(n,'',p);close(input);close(output);end.3.瑞士轮(swiss.cpp/c/pas)【背景】在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。
前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。
后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长。
本题中介绍的瑞士轮赛制,因最早使用于1895年在瑞士举办的国际象棋比赛而得名。
它可以看作是淘汰赛与循环赛的折衷,既保证了比赛的稳定性,又能使赛程不至于过长。
【问题描述】2*N名编号为1~2N的选手共进行R轮比赛。
每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。
选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。
总分相同的,约定编号较小的选手排名靠前。
每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1名和第2名、第3名和第4名、……、第2K–1名和第2K名、……、第2N–1名和第2N名,各进行一场比赛。
每场比赛胜者得1分,负者得0分。
也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。
现给定每个选手的初始分数及其实力值,试计算在R轮比赛过后,排名第Q的选手编号是多少。
我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。
【输入】输入文件名为swiss.in。
输入的第一行是三个正整数N、R、Q,每两个数之间用一个空格隔开,表示有2*N名选手、R轮比赛,以及我们关心的名次Q。
第二行是2*N个非负整数s1,s2,…,s2N,每两个数之间用一个空格隔开,其中s i表示编号为i的选手的初始分数。
第三行是2*N个正整数w1,w2,…,w2N,每两个数之间用一个空格隔开,其中w i表示编号为i的选手的实力值。
【输出】输出文件名为swiss.out。
输出只有一行,包含一个整数,即R轮比赛结束后,排名第Q的选手的编号。
对于30%的数据,1≤N≤100;对于50%的数据,1≤N≤10,000;对于100%的数据,1≤N≤100,000,1≤R≤50,1≤Q≤2N,0≤s1,s2,…,s2N≤810,1≤w1,w2,…,w2N≤810。
【解题】题目虽然长,但理解题意后就发现解题的瓶颈在于排序。
如果每一轮比赛的结果都进行快速排序,时间复杂度为O(Rlongn),但事实证明这样只能拿60分。
如何AC,这需要一个巧算法:分析得知,快速排序实际上进行了许多无用的工作:如果两个人在第i轮都赢了,那么第i轮后的先后关系与第i-1轮是一样的;反之,如果两人都输了,他们的先后关系也不会变。
所以,我们有一个新算法:一开始做一趟快速排序,然后对于每一轮,将此轮的n个赢者(他们的先后关系和上一轮不变)和n个输者(他们的先后关系和上一轮也不变分开,然后就是归并,于是时间复杂度O(Rn))(实践证明,如果单纯的排序r次,必然结果是超时。
事实上只需一次真正意义上的排序以后,在以后的比赛中,按原顺序分成两组,获胜组和失败组,这两组依然是有序的,再把这两组归并成一组,就可以了。
总时间复杂度O(N*R))programswiss;vara,b,v:array[1..200000]oflongint;c,d:array[1..100000,1..2]oflongint;n,r,q,i,j:longint;procedureqsort(l,r:longint);vari,j,mid1,mid2,t:longint;begini:=l;j:=r;mid1:=a[(l+r)div2];mid2:=v[(l+r)div2];repeat//按分数从高到低排序,分数相同的,编号较小的选手排名靠前while(a[i]>mid1)or(a[i]=mid1)and(v[i]<mid2)doinc(i);while(a[j]<mid1)or(a[j]=mid1)and(v[j]>mid2)dodec(j);ifi<=jthenbegint:=a[i];a[i]:=a[j];a[j]:=t;t:=v[i];v[i]:=v[j];v[j]:=t;inc(i);dec(j);end;untili>j;ifi<rthenqsort(i,r);ifl<jthenqsort(l,j);end;proceduremergesort;//归并排序vari,l1,l2:longint;begini:=0;l1:=1;l2:=1;repeatif(c[l1,1]>d[l2,1])or(c[l1,1]=d[l2,1])and(c[l1,2]<d[l2,2])thenbegini:=i+1;a[i]:=c[l1,1];v[i]:=c[l1,2];l1:=l1+1;endelsebegini:=i+1;a[i]:=d[l2,1];v[i]:=d[l2,2];l2:=l2+1;end;until(l1>n)or(l2>n);whilel1<=ndobegini:=i+1;a[i]:=c[l1,1];v[i]:=c[l1,2];l1:=l1+1;end;whilel2<=ndobegini:=i+1;a[i]:=d[l2,1];v[i]:=d[l2,2];l2:=l2+1;end;end;begin//主程序assign(input,'swiss.in');reset(input);assign(output,'swiss.out');rewrite(output);readln(n,r,q);fori:=1ton*2doread(a[i]);//数组a保存初始分数fori:=1ton*2doread(b[i]);//数组b保存实力值fori:=1ton*2dov[i]:=i;//数组v[i]保存排名第i的选手编号qsort(1,2*n);fori:=1tordobeginforj:=1tondoifb[v[2*j-1]]>b[v[2*j]]thenbegininc(a[2*j-1]);c[j,1]:=a[2*j-1];//数组c[j,1]保存嬴方的总分;数组c[j,2]保存嬴方的号码;c[j,2]:=v[2*j-1];d[j,1]:=a[2*j];//数组d[j,1]保存输方的总分;数组d[j,2]保存输方的号码;d[j,2]:=v[2*j];endelsebegininc(a[2*j]);c[j,1]:=a[2*j];c[j,2]:=v[2*j];d[j,1]:=a[2*j-1];d[j,2]:=v[2*j-1];end;mergesort;end;writeln(v[q]);close(input);close(output);end.4.表达式的值(exp.cpp/c/pas)【问题描述】1.先计算括号内的,再计算括号外的。