noip2002 提高组 复赛试题及参考程序(pascal)

合集下载

Pascal历届NOIP复赛试题(1)-分析

Pascal历届NOIP复赛试题(1)-分析

第12讲-历届NOIP复赛试题(1)模拟试题1. Cantor表(cantor.pas/c/cpp)【问题描述】现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。

他是用下面这一张表来证明这一命题的:我们以Z字形给上表的每一项编号。

第一项是1/1,然后是1/2,2/1,3/1,2/2,…【输入】整数N(1≤N≤10000000)【输出】表中的第N项【样例输入】7【样例输出】- 1 -1/4【分析】基础题,模拟。

首先确定所在斜行,然后针对奇数行和偶数行进行计算。

【参考代码】varn,x:longint ;beginassign(input,'cantor.in');reset(input);assign(output,'cantor.out');rewrite(output);readln(n);x:=0;repeat//确定所在的斜行inc(x);n:=n-x ;until n<=0;if x mod2=0then write((x+n),'/',(1-n))//确定如何输出else writeln((1-n),'/',(x+n));close(input);close(output );end.2. 回文数(huiwen.pas/c/cpp)【问题描述】若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加56(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:STEP1:87+78 = 165 STEP2:165+561 = 726STEP3:726+627 = 1353 STEP4:1353+3531 = 4884在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10,N=16)进制数M,求最少经过几步可以得到回文数。

NOIP历年复赛提高组试题(2004-2013)

NOIP历年复赛提高组试题(2004-2013)

第十届全国信息学奥林匹克分区联赛(NOIP2004)复赛试题(提高组竞赛用时:3小时)1、津津的储蓄计划(Save.pas/dpr/c/cpp)【问题描述】津津的零花钱一直都是自己管理。

每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。

因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。

津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。

到了11月月末,津津手中会剩下3元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。

有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。

如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。

如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

【输入文件】输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。

【输出文件】输出文件save.out包括一行,这一行只包含一个整数。

如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。

【样例输入1】29023028020030017034050908020060【样例输出1】-7【样例输入2】29023028020030017033050908020060【样例输出2】1580【问题描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。

NOIP2002普及组初赛试题及答案

NOIP2002普及组初赛试题及答案

第八届全国青少年信息学奥林匹克联赛(NOIP2002)试题(普及组PASCAL语言二小时完成)全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效一.选择一个正确答案代码(A/B/C/D,填入每题的括号内(每题1.5分,多选无分,共30分)1)微型计算机的问世是由于( ) 的出现。

A) 中小规模集成电路 B) 晶体管电路 C) (超)大规模集成电路 D) 电子管电路2)下列说法中正确的是( ) 。

A) 计算机体积越大,其功能就越强B) CPU的主频越高,其运行速度越快C) 两个显示器屏幕大小相同,则它们的分辨率必定相同D)点阵打印机的针数越多,则能打印的汉字字体越多3)Windows98中,通过查找命令查找文件时,若输入F*.? , 则下列文件( ) 可以被查到。

A) F.BAS B) FABC.BAS C) F.C D) EF.4)CPU处理数据的基本单位是字,一个字的字长( ) 。

A) 为8个二进制位 B) 为16个二进制位C) 为32个二进制位 D) 与芯片的型号有关5)资源管理器的目录前图标中增加"+"号,这个符号的意思是( ) 。

A) 该目录下的子目录已经展开 B) 该目录下还有子目录未展开C) 该目录下没有子目录 D) 该目录为空目录,6)下列哪一种程序设计语言是解释执行的( ) 。

A) Pascal B) GWBASIC C) C++ D) FORTRAN7)启动WORD的不正确方法是( ) 。

A) 单击Office工具栏上的Word图标B) 单击"开始"→"程序"→WordC) 单击"开始"→"运行",并输入Word按回车D) 双击桌面上的"Word快捷图标"8)多媒体计算机是指( ) 计算机。

A) 专供家庭使用的 B) 装有CDROM的C) 连接在网络上的高级 D) 具有处理文字、图形、声音、影像等信息的9)在树型目录结构中,不允许两个文件名相同主要是指( ) 。

NOIP历年复赛提高组试题(2006-2014)

NOIP历年复赛提高组试题(2006-2014)

第十二届全国信息学奥林匹克分区联赛(NOIP2006)复赛试题(提高组竞赛用时:3小时)关于竞赛中不同语言使用限制的说明一.关于使用Pascal语言与编译结果的说明1.对于Pascal语言的程序,当使用IDE和fpc编译结果不一致时,以fpc的编译结果为准。

2.允许使用数学库(uses math子句),以及ansistring。

但不允许使用编译开关(最后测试时pascal的范围检查开关默认关闭:{$R-,Q-,S-}),也不支持与优化相关的选项。

二.关于C++语言中模板使用的限制说明1.允许使用的部分:标准容器中的布尔集合,迭代器,串,流。

相关的头文件:<bitset > <iterator > <string > <iostream >2.禁止使用的部分:序列:vector,list,deque序列适配器:stack, queue, priority_queue 关联容器:map, multimap, set, multiset 拟容器:valarray 散列容器:hash_map, hash_set, hash_multimap, hash_multiset 所有的标准库算法相关头文件:<vector > <list > <deque > <stack > <map > <set > <algorithm >1.能量项链(energy.pas/c/cpp)【问题描述】在Mars星球上,每个Mars人都随身佩带着一串能量项链。

在项链上有N颗能量珠。

能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。

并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。

因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。

历届noip提高组复赛试题

历届noip提高组复赛试题

NOI’ 95“同创杯”全国青少年信息学(计算机)奥林匹克竞赛分区联赛复赛试题(高中组)(上机编程,完成时间:210 分钟)<1>编码问题:设有一个数组A:ARRAY[0..N-1] OF INTEGER;数组中存放的元素为0~N-1 之间的整数,且A[i]≠ A[j](当i≠ j时)。

例如: N=6 时,有:此时,数组 A 的编码定义如下:A[0] 的编码为0;A[i] 的编码为:在A[0] ,A[1]∴上面数组 A 的编码为:A= ( 4,3, 0, 5,1, 2),, A[i-1] 中比 A[i] 的值小的个数(B= (0, 0,0,3,1, 2)i=1 ,2,, N-1 )程序要求解决以下问题:①给出数组 A 后,求出其编码。

②给出数组 A 的编码后,求出 A 中的原数据。

<2> 灯的排列问题:设在一排上有 N 个格子( N≤ 20),若在格子中放置有不同颜色的灯,每种灯的个数记为 N 1, N2, N k( k 表示不同颜色灯的个数)。

放灯时要遵守下列规则:①同一种颜色的灯不能分开;②不同颜色的灯之间至少要有一个空位置。

例如: N=8 (格子数)R=2 (红灯数)B=3 (蓝灯数)放置的方法有:R-B 顺序R R B B BR R B B BR R B B BR R B B BR R B B BR R B B BB-R顺序B B B BBBBBBBBBBBBBBR RRRBRRRRRRRR放置的总数为12 种。

数据输入的方式为:NP1(颜色,为一个字母)P2N1(灯的数量)N2Q(结束标记, Q 本身不是灯的颜色)程序要求:求出一种顺序的排列方案及排列总数。

<3> 设有一个四层的积木块,1~ 4 层积木块的数量依次为:5, 6,7, 8如下图所示放置:815851691423414326其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算出来的。

noip复习资料

noip复习资料

NOIP2002复习资料作者:徐沛来2002.11.23NOIP2002复习资料作者徐沛来第一章 Pascal函数与技巧一、常用函数与过程:* abs(x):y取x的绝对值,x与y可为整型或实型。

* append(f:text)用赋给f的文件名打开存在的外部文件。

如果不存在给定的文件,产生错误。

如果f已经存在,就先关闭再重新打开它。

当前文件指针指向文件尾。

* frac(x):y取x的小数部分,x与y均为实型。

* int(x):y取x的整数部分,x与y均为实型,常写成trunc(int(x)).* random(x):y在0-x之间的整数中随机找一个整数,x与y均为整型。

* sin(x):y; cos(x):y; arctan(x):y; exp(x):y; ln(x):y均与数学运算一致,三角函数返回的均为弧度,转换成角度即乘以Pi除以180.* copy(str,n1,n2):substr从字符串str中取从第n1个字符开始长度为n2个字符的子串substr.n1和n2是整型表达式,如果n1大于s的长度,则返回空字符串。

如果指定的n2大于第n1个字符后剩下的字符数,则返回剩下的字符串。

* pos(substr,str):num查找substr是否为str的子串,若是则返回substr在str中的起始位置,若否则返回0.* val(str,int,code)将字串str转为数值型数据存入int, 如果字符串无效,其中非法字符的下标放在Code 中;否则,code为零。

* str(num,str)将num表达式转成字符串str。

* delete( str,n1,n2)从原字符串str中删去一个从n1开始长度为n2的子串,如果Index比s长,不删除任何字符。

如果指定的Count大于从第1ndex大到结尾的字符数,删除剩余部分。

NOIP2002复习资料 作者 徐沛来* Insert(Source :String ;Var S :String ;Index :Integer)Source 是字符串表达式。

2002年NOIP联赛提高组初赛试题及答案

2002年NOIP联赛提高组初赛试题及答案

第八届全国青少年信息学奥林匹克联赛(NOIP2002)初赛试题(提高组PASCAL语言二小时完成)审定:全国青少年信息学奥林匹克竞赛科学委员会主管:中国科协、教育部主办:中国计算机学会承办:江苏省科协青少年科技中心●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一.选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分)1.微型计算机的问世是由于()的出现。

A)中小规模集成电路B)晶体管电路C)(超)大规模集成电路D)电子管电路2.中央处理器(CPU)能访问的最大存储器容量取决于()。

A)地址总线B)数据总线C)控制总线D)实际内存容量3.十进制书11/128可用二进制数码序列表示为:()。

A)1011/1000000 B)1011/100000000 C)0.001011 D)0.00010114.算式(2047)10 -(3FF)16 +(2000)8的结果是()。

A)(2048)10B)(2049)10C)(3746)8D)(1AF7)165.已知x =(0.1011010)2,则[ x / 2 ]补=()2 。

A)0.1011101 B)11110110 C)0.0101101 D)0.1001106.IPv4地址是由()位二进制数码表示的。

A)16 B)32 C)24 D)87.计算机病毒传染的必要条件是:()。

A)在内存中运行病毒程序B)对磁盘进行读写操作C)在内存中运行含有病毒的可执行的程序D)复制文件8.在磁盘上建立子目录有许多优点,下列描述中不属于建立子目录优点的是()。

A)便于文件管理B)解决根目录中目录项个数有限问题C)加快文件查找速度D)节省磁盘使用空间9.在使用E-mail前,需要对Outlook进行设置,其中ISP接收电子邮件的服务器称为()服务器。

A)POP3 B)SMTP C)DNS D)FTP10.多媒体计算机是指()计算机。

【精选资料】NOIP提高组复赛试题与简解转载

【精选资料】NOIP提高组复赛试题与简解转载

Day1铺地毯【问题描述】为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。

一共有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。

【输入输出样例 1】【输入输出样例说明】如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2,2)的最上面一张地毯是3 号地毯。

【输入输出样例 2】【输入输出样例说明】如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5)没有被地毯覆盖,所以输出-1。

【数据范围】对于 30%的数据,有n≤2;对于 50%的数据,0≤a, b, g, k≤100;对于 100%的数据,有0≤n≤10,000,0≤a, b, g, k≤100,000。

【一句话题意】给定n个按顺序覆盖的矩形,求某个点最上方的矩形编号。

【考察知识点】枚举【思路】好吧我承认看到图片的一瞬间想到过二维树状数组和二维线段树。

置答案ans=-1,按顺序枚举所有矩形,如果点在矩形内则更新ans。

注意题中给出的不是对角坐标,实际上是(a,b)与(a+g,b+k)。

NOIP历年复赛提高组试题

NOIP历年复赛提高组试题

全国信息学奥林匹克分区联赛(NOIP)复赛提高组试题第一届全国信息学奥林匹克分区联赛(NOIP1995)复赛试题(提高组竞赛用时:3.5小时)1、编码问题设有一个数组A:ARRAY[0..N-1]OFINTEGER;数组中存放的元素为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中的原数据。

2、灯的排列问题设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……N k(k表示不同颜色灯的个数)。

放灯时要遵守下列规则:①同一种颜色的灯不能分开;②不同颜色的灯之间至少要有一个空位置。

例如:N=8(格子数);R=2(红灯数);B=3(蓝灯数),放置的方法有:R-B顺序B-R顺序放置的方法总数为12种。

数据输入的方式为:NP1(颜色,为一个字母)N1(灯的数量)P2 N2……Q(结束标记,Q本身不是灯的颜色)程序要求:求出一种顺序的放置(排列)方案及放置(排列)方案总数。

3、积木块上的数字设有一个四层的积木块,1~4层积木块的数量依次为:5,6,7,8,如下图所示放置:其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算出来的。

计算的方法是:第三层的某个数据A是由第四层相邻的两个数据B,C经过某种计算后产生的:计算所用到的计算符为:+,-,⨯,且无优先级之分(自左向右计算),运算符最多为2个。

如:3+4⨯5=35 5⨯4+3=23可以看出,上图中的第三层的数据是由第四层的数据用以下计算公式计算出来的:A=B⨯C+B也就是:8=2⨯3+2,15=3⨯4+3,……14=2⨯6+2程序要求:给出第四层与第三层的数据后,将第一、二层的每块积木标上相应的数据,并输出整个完整的积木图及计算公式。

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx

(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx

NOIP 提高组初赛历年试题及答案阅读题篇程序写果(共 4 ,每 8 分,共 32 分)程序的最好方法并非是依次从到尾。

程序不像迷,我无法从末尾几找到答案,也不像一本引人入的籍,只需直接翻到褶最多的那几,我就能找到最精彩的片断。

因此我在程序,最好逐一考察研究每一段代,搞清楚每一段代的来去脉,理解每一段代在程序中所起的作用,而形成一个虚的程序构,并以此基来行。

1、分:高入手,逐深入,正确理解程序。

2、写注解:固化、、提已有的理解成果。

3、先模:根据代序跟踪量,模运算。

4、找律:先模几次循后,找出背后的律。

5、看功能:从代构和运算果判断程序功能。

6、猜算法:有不知道算法,通构和函数猜一猜。

7、方法:了解程序本后,一个熟悉的方法。

大多数人来,写程序是令人开心的一件事情,人的程序却很痛苦,很恐惧,宁愿自己重写一遍。

其到好的程序,就像一篇美文,令人心神怡,豁然开朗,因背后是一个人的思,甚至整个人生。

人的程序不可以巩固自己的知,启自己的思,提升自己的修养,你收,其,也是在学、在、在工作中的最重要、最常用的基本功。

如果写程序是把自己的思化代,程序就是把代化你理解的人的思。

当你程序有烈的代入感,像演一,真正入到的精神世界,面部表情也随之日丰富起来。

祝你!你通关了!之,看得多,得多,拼得多,你就考得多⋯⋯NOIP2011-1 .#include <iostream>#include <cstring>using namespace std;const int SIZE = 100;int main(){int n,i,sum,x,a[SIZE];cin>>n;memset(a,0,sizeof(a));for(i=1;i<=n;i++){cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){i++;sum+=a[i];}cout<<i<<endl;return 0;}输入:114 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i 值(中位数),而不是sum ,也不是a[x]输出: 3NOIP2011-2 .#include <iostream> using namespace std; int n;void f2(int x,int y); void f1(int x,int y){if(x<n)f2(y,x+y);}void f2(int x,int y){cout<<x<<' ';f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入: 30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出: 1 2 5 13 34NOIP2011-3 .#include <iostream>using namespace std; const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]);visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++){cin>>a>>b>>c;e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++)visited[i]=false;ans=0;for(i=1;i<=n;i++)dfs(i,0);cout<<ans<<endl;return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS ),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则 ans=len,可以说明这是个在图中用DFS找最长的路径的程序。

noip模拟题 pascal

noip模拟题 pascal

noip模拟题题目一览题目概况:题目名称芝麻开门疯狂的数列武器程序名称open crazy weapon输入文件名open.in crazy.in weapon.in输出文件名open.out crazy.out weapon.out测试点数量101010每测试点时限1秒1秒1秒每测试点分值101010内存上限128M128M128M注意事项:1.务必看清题目,严格按照要求的格式输入、输出。

2.在调试程序时请先用题目中的样例数据,然后再自行设计多组测试数据进行调试。

3.文件的命名规则:程序文件的扩展名采用所用的语言环境的默认扩展名。

程序文件主文件名为每题题目后括号内的文件名,输入、输出文件名为每题输入、输出文件括号内的文件名。

一、芝麻开门(open)话说丁丁终于等到了一年一次的休假,他决定好好利用这个假期。

很久以前他就发现了一个神秘的山洞,一直没有机会去探险,这次终于可以去探个究竟了。

当他来到山洞前却被一扇石门拦住了,上面有一个数字,和两个按钮分别“Yes”和“No”,有个多次冒险经验的他一眼就看出,这两个按钮就是开启石门的关键,按对了石门打开,按错了会触发机关将遇到空前的危险。

经过仔细推敲,他发现原来那个数字是素数就按“Yes”按钮,否则按“No”按钮。

面对一个如此庞大的数字,丁丁想起了会编程的你,请你帮忙写个程序,判断他该按那个按钮。

输入文件(open.in)一个整数n,即石门上的数字。

输出文件(open.out)丁丁应该按的按钮(注意大小写)。

样例输入:17样例输出:Yes数据范围:0<=n<=231-1二、疯狂的数列(crazy)在你的帮助下,丁丁终于打开了石门,进去后发现里面有个面目狰狞的妖怪。

这只妖怪正怒视着丁丁,然后一言不发的在地上写了一串数字:1,12,123,1234,12345,……,12345678910,1234567891011,……。

然后告诉丁丁:“你要是能知道这个数列的前n项里有多少项能被3整除,我就放你过去,否则,嘿嘿……吃了你!”看来这个妖怪的数学不错,不过数学更是丁丁的强项,很快就算出了答案。

Noip2002复习资料

Noip2002复习资料
二、小技巧
1.ord('0')=48; ord('A'):=65; ord('a')=97; chr(32)=’ ‘; chr(33)=’!’;
2.求x^y: int(exp(y*ln(x)))
3.求x的n次方根:exp(1/n*ln(x))
4.标识符不能以数字开头,其中不能有空格,点等符号。
|x3 y3 1|
*海伦公式: 令p=(a+b+c)/2, 则 S=sqrt(p*(p-a)*(p-b)*(p-c));
三、组合公式
1.长度为n的0-1串中最多含k个1的
例 长度为N (N<=31)的01串中1的个数小于等于L的串组成的集合中找出按大小排序后的第I个01串。
2给定序列入栈出栈后可形成的情况总数为 C(n,2n) – C(n-1,2n)+1.
一、数论算法
1.求两数的最大公约数
function gcd(a,b:integer):integer;
begin
if b=0 then gcd:=a
else gcd:=gcd (b,a mod b);
end ;
2.求两数的最小公倍数
function lcm(a,b:integer):integer;
例如当n=3时,最多得到6组不同的编序方案。
四、数论公式
1.模取幂 a^b mod n= (..(a mod b)*a) mod b)*a..) mod b;
2.n的约数的个数
若n满足n=a1^n1 * a2^n2 * a3^n3 * ... * am^nm,则n约数的个数为
(n1+1)(n2+1)(n3+1)...(nm+1)

历届noip提高组复赛试题

历届noip提高组复赛试题

N O I’95“同创杯”全国青少年信息学(计算机)奥林匹克竞赛分区联赛复赛试题(高中组)(上机编程,完成时间:210分钟)<1>编码问题:设有一个数组A:ARRAY[0..N-1] OF INTEGER;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。

N-1),N1数据输入的方式为:NP1(颜色,为一个字母) N1(灯的数量)P2 N2……Q(结束标记,Q本身不是灯的颜色)程序要求:求出一种顺序的排列方案及排列总数。

<3> 设有一个四层的积木块,1~4层积木块的数量依次为:5,6,7,82个。

例如n=2时的比赛安排:队 1 2 3 4比赛 1==2 3==4 一天1==3 2==4 二天1==4 2==3 三天2.数制转换(20分)设有一个字符串A$的结构为:A$=’m<n>p’其中m为数字串(长度<=20),而n,p均为1或2位的数字串(其中所表达的内容在2-10之间)。

程序要求:从键盘上读入A$后(不用正确性检查),将A$中的数字串m(n进制),以p进制的形式输出。

例如:A$=’48<10>8’其意义为:将10进制数48,转换成8进制数输出。

输出结果为:48<10>=60<8>4.挖地雷(30分)在一个地图上有N 个地窖(N<=20),每个地窖中埋有一定数量的地雷。

同时,给出地窖之间的连接路径。

[题目要求] 当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接,当设计一(表示1g 砝码有a1个,2g 砝码有a2个,…,20g 砝码有a6个)输出方式:Total=N(N 表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)如输入:1_1_0_0_0_0 (注:下划线表示空格)输出:TOTAL=3 表示可以称出1g ,2g ,3g 三种不同的重量。

[noip2002 提高组] 矩形覆盖 讲解 -回复

[noip2002 提高组] 矩形覆盖 讲解 -回复

[noip2002 提高组] 矩形覆盖讲解-回复矩形覆盖是一个经典的问题,也是一个与数学和计算机科学密切相关的问题。

它可以通过多种方法解决,包括递归、动态规划等。

本文将以[noip2002 提高组]矩形覆盖讲解为主题,详细地介绍解决这个问题的步骤和方法。

问题描述:矩形覆盖问题是指给定一块长为n,宽为m的矩形,用2*1的小矩形去覆盖这个大矩形,有多少种不同的方法。

其中n和m的值都是大于等于0的整数。

解题思路:我们可以以递归的方式来解决这个问题。

考虑到大矩形的覆盖方式取决于最后一个小矩形的放置方式,我们可以将矩形的摆放分为两种情况进行讨论。

首先考虑最后一个小矩形放在大矩形的长边上的情况。

最后一个小矩形放在长边上时,可以将大矩形划分为两个部分。

如果最后一个小矩形竖着放,那么剩下的部分可以用的方法数目就是覆盖长度为m-1的矩形的方法数,即f(m-1)。

同理,如果最后一个小矩形横着放,那么剩下的部分可以用的方法数目就是覆盖长度为m-2的矩形的方法数,即f(m-2)。

所以,在最后一个小矩形放在长边上的情况下,覆盖这块大矩形的方法数为f(m-1) + f(m-2)。

接下来考虑最后一个小矩形放在宽边上的情况。

同样地,可以将大矩形划分为两个部分。

如果最后一个小矩形竖着放,那么剩下的部分可以用的方法数目就是覆盖长度为n-1的矩形的方法数,即f(n-1)。

同理,如果最后一个小矩形横着放,那么剩下的部分可以用的方法数目就是覆盖长度为n-2的矩形的方法数,即f(n-2)。

所以,在最后一个小矩形放在宽边上的情况下,覆盖这块大矩形的方法数为f(n-1) + f(n-2)。

综上所述,覆盖一块大矩形的方法总数为f(n) + f(m)。

但是,我们需要注意到,如果大矩形的长或宽为0,则无法进行覆盖,此时方法数为0。

另外,当大矩形的长或宽为1时,只有一种摆放方式,即将小矩形竖着摆放或横着摆放。

所以,我们可以将初始情况设为f(0) = 0, f(1) = 1, f(2) = 2。

NOIP历年复赛提高组试题(2004-2013)

NOIP历年复赛提高组试题(2004-2013)

NOIP历年复赛提高组试题(2004-2013)第十届全国信息学奥林匹克分区联赛(NOIP2004)复赛试题(提高组竞赛用时:3小时)1、津津的储蓄计划(Save.pas/dpr/c/cpp)【问题描述】津津的零花钱一直都是自己管理。

每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。

因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。

津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。

到了11月月末,津津手中会剩下3元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。

有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。

如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。

如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

【输入文件】输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。

【输出文件】输出文件save.out包括一行,这一行只包含一个整数。

如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。

【样例输入1】290230908020060【样例输出2】15802、合并果子(fruit.pas/dpr/c/cpp)【问题描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。

noip2002 提高组 复赛试题及参考程序(pascal)

noip2002 提高组 复赛试题及参考程序(pascal)
在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一 个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2), 其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。
如下图:
小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小 球落到地面后不能被接受)。
题二 字串变换 (NOIPG2.pas/c/cpp noipg2.in noipg2.out) [问题描述]:
已知有两个字串 A$, B$ 及一组字串变换的规则(至多 6 个规则): A1$ -> B1$ A2$ -> B2$
规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。 例如:A$='abcd' B$='xyz'
begin hash:=(hash shl 4)+ord(st[i]); <>0 then hash:=hash xor(g shr 24); hash:=hash and(not g);
end; exit(hash mod maxm); end;
end; s1[p]:=' '; p:=pos(map[i,1],s1); end; end; end; writeln('NO ANSWER!'); end;
begin assign(input,'noipg2.in');reset(input); assign(output,'noipg2.out');rewrite(output); init; bfs; close(input);close(output);

NOIP2002提高组题解

NOIP2002提高组题解

NOIP2002提高组题解考察知识:贪心,模拟算法难度:XX 实现难度:XX分析:此题有很多解法,下面介绍我的算法步骤:(具体请参见代码)0.定义pos表示已经处理好的部分(从左往右),pos初始值为01.从左往右(i=1 to n)扫描,并统计sum=sum+a[i]2.一旦sum除以i-pos大于平均值,cnt+=(i-pos-1),并修改pos=i,sum=sum-ave*(i-pos)如果sum不等于0则cnt++3.重复1.2.直到i>n为什么这个算法是正确的呢,这需要我们严密证明:参考证明思路:0.证明这种算法是最优的(用贪心证明)1.先证明当达到sum/(i-pos)>aver时将pos+1~i牌数均调为aver最少操作次数为i-pos-12.显然如果此时牌没有用完则必须向右移,所以有cnt++代码:1.#include<cstdio>ing namespace std;3.int n,a[105],aver=0;4.int sum,pos;5.int main(){6.int cnt=0;7.scanf("%d",&n);8.for(int i=1;i<=n;i++) scanf("%d",a+i),aver+=a[i];9.aver/=n;10.for(int i=1;i<=n;i++){11.sum+=a[i];12.if(sum>=(i-pos)*aver){t+=(i-pos-1);//把pos+1~i的牌处理好需要的最少操作数14.sum-=aver*(i-pos);//把处理好的牌删除掉15.if(sum) cnt++;//牌没有用完则必定需要向右移16.pos=i;17.}18.}19.printf("%d\n",cnt);20.return 0;21.}T2:字串变换考察知识:bfs,dfs,搜索的优化,字符串算法难度:XX 实现难度:XXX方法一:dfs对于这道题我首先写了一个dfs暴力程序60->80分,最后一个点要跑近150s,我当时就震惊了,我当然知道要超时,但没有想到超时这么严重然后我搬出了早已想好的dfs优化,瞬间快了几百倍,1s以内(208ms)就可以出答案了,下面介绍优化后的dfs:dfs双端搜索:就是从起点终点两边同时搜索,到中途相遇1.我们先搜索字符串A不断变化五步之内可以达到的所有状态的最小步数,并存入map<string,int>中(如果你非要设身处地,坚持在NOIP不能用STL的年份的NOIP题不用STL,那么你就用字符串hash吧,建议使用双hash减少冲突系数)2.在反向搜索,搜索字符串B在5步之内可以达到的所有状态的最小步数,如果map中有,ans=min(ans,cur+mp[str])3.判断并输出答案细节见代码:1.#include<iostream>2.#include<cstdio>3.#include<algorithm>4.#include<cstring>5.#include<string>6.#include<map>ing namespace std;8.map<string,int>mp;9.char A[25],B[25],Aa[250],a[10][25],b[10][25];10.int n,ans=100,len[10][2];11.void dfs1(int cur,char Aa[]){12.string stri=Aa;13.if(!mp.count(stri)) mp[stri]=cur;14.else mp[stri]=min(mp[stri],cur);15.char tmp[250];//注意防中间字符串爆数组16.int L=strlen(Aa);17.if(cur>5||cur>=ans) return;18.//如果直接到达B状态:19.if(strcmp(B,Aa)==0) {ans=min(ans,cur);return;}20.for(int i=0;i<L;i++)21.for(int j=0;j<n;j++) if(i+len[j][0]<=L){22.strcpy(tmp,Aa+i);23.tmp[len[j][0]]='\0';24.if(strcmp(a[j],tmp)==0){//字符串替换,重点25.strcpy(tmp,Aa);26.strcpy(tmp+i,b[j]);27.strcpy(tmp+i+len[j][1],Aa+i+len[j][0]);28.dfs1(cur+1,tmp);29.}30.}31.}32.void dfs2(int cur,char Aa[]){33.string stri=Aa;34.//如果正向搜索已经到达该状态:35.if(mp.count(stri)){ans=min(ans,mp[stri]+cur);retur n;}36.char tmp[250];37.int L=strlen(Aa);38.if(cur>5||cur>=ans) return;39.for(int i=0;i<L;i++)40.for(int j=0;j<n;j++) if(i+len[j][1]<=L){41.strcpy(tmp,Aa+i);42.tmp[len[j][1]]='\0';43.if(strcmp(b[j],tmp)==0){44.strcpy(tmp,Aa);45.strcpy(tmp+i,a[j]);46.strcpy(tmp+i+len[j][0],Aa+i+len[j][1]);47.dfs2(cur+1,tmp);48.}49.}50.}51.int main(){52.scanf("%s%s",A,B);53.for(n=0;scanf("%s%s",a[n],b[n])==2;n++);54.for(int i=0;i<n;i++) len[i][0]=strlen(a[i]),len[i][1]=strlen(b[i]);55.strcpy(Aa,A);//正向搜索56.dfs1(0,Aa);57.strcpy(Aa,B);//反向搜索58.dfs2(0,Aa);59.if(ans<=10) printf("%d\n",ans);60.else printf("NO ANSWER!\n");61.return 0;62.}方法二:bfs搜索对于这道题,bfs搜索应该优于dfs(速度快得多),仅用单向搜索就可以AC,当然你也可以(动态)双向搜索代码:1.#include<iostream>2.#include<cstdio>3.#include<algorithm>4.#include<cstring>5.#include<string>6.#include<map>7.#include<queue>ing namespace std;9.struct node{10.char tmp[210];11.int cur;12.};13.map<string,int>mp;14.char A[25],B[25],Aa[250],a[10][25],b[10][25];15.int n,ans=100,len[10][2];16.void bfs(){17.string stri;18.char tmp[210],Aa[210];//注意防中间字符串爆数组19.queue<node>q;20.node T,TT;21.strcpy(T.tmp,A);22.T.cur=0;23.q.push(T);24.while(!q.empty()){25.T=q.front();q.pop();26.strcpy(Aa,T.tmp);27.stri=Aa;28.if(mp.count(stri)) continue;//判重29.else mp[stri]=1;30.if(strcmp(Aa,B)==0||T.cur>10) {ans=T.cur;return;}31.int L=strlen(Aa);32.for(int i=0;i<L;i++)33.for(int j=0;j<n;j++) if(i+len[j][0]<=L){34.strcpy(tmp,Aa+i);35.tmp[len[j][0]]='\0';36.if(strcmp(a[j],tmp)==0){//字符串替换,重点37.strcpy(tmp,Aa);38.strcpy(tmp+i,b[j]);39.strcpy(tmp+i+len[j][1],Aa+i+len[j][0]);40.strcpy(TT.tmp,tmp);41.TT.cur=T.cur+1;42.q.push(TT);43.}44.}45.}46.}47.int main(){48.scanf("%s%s",A,B);49.for(n=0;scanf("%s%s",a[n],b[n])==2;n++);50.for(int i=0;i<n;i++) len[i][0]=strlen(a[i]),len[i][1]=strlen(b[i]);51.bfs();52.if(ans<=10) printf("%d\n",ans);53.else printf("NO ANSWER!\n");54.return 0;55.}T3:自由落体考察知识:数学(物理)分析算法难度:XX+ 实现难度:XX+tips:+相当于0.5个X用一点高中数学或物理分析就可以了,如图:(部分字母与原题不一致)接下来就是判断两条线段(把时间区间看成线段)是否相交了具体细节看代码:1.#include<iostream>2.#include<cstdio>3.#include<cmath>ing namespace std;5.const double eps=0.0001;6.double h,s,v,l,k;7.int n,ans;8.int main(){9.int cnt=0;10.double a,b,c,d;11.scanf("%lf%lf%lf%lf%lf%d",&h,&s,&v,&l,&k,&n);12.for(int i=0;i<n;i++){13.a=(s-i-eps)/v,b=(s-i+l+eps)/v;//处理精度误差14.c=sqrt((h-k)/5.0),d=sqrt(h/5.0);15.if((c<=a&&a<=d)||(c<=b&&b<=d)||(a<=c&&c< =b)||(a<=d&&d<=b))t++;17.}18.printf("%d\n",cnt);19.return 0;20.}上面是我自己的解法,我又看了别人的解法:换参考系,将木块视为静止,则小球可以看作平抛运动看上去这个解法也挺不错的,请读者思考T4:矩形覆盖考察知识:搜索,计算几何,分治算法难度:XXXX 实现难度:XXXX其实只要你想到了方法,这道题也不是很难分析:注意到k<=4我们可以分类讨论1'.k=1(calc1)显然最小面积为=(最大横坐标-最小横坐标)*(最大纵坐标-最小纵坐标)2'.k=2(calc2)考虑这两个矩形的位置关系:我们可以把这些点划分为两个不同集合,而两个集合中点可以用图中方法覆盖我们只需要考虑怎么划分集合然后调用calc1就可以了3'.k=3(calc3)考虑三个矩形位置关系:同理,我们只需要考虑怎么划分点集,然后调用calc1,calc2就可以了4'.k=4(calc4)考虑四个矩形位置关系:同calc3,我们只需要考虑怎么划分点集,然后调用calc1,calc2,calc3就可以了那么,问题来了,我们怎么划分点集呢?图中给出的是用一条线来划分,其实不然,我们应该考虑这些点怎么划分满足划分之后覆盖所有点集的矩形不相交具体实现看代码:(注意:代码中的memcpy是为了保证calcx在调用了比它低级的calc后仍然能保证点集有序)1.#include<iostream>2.#include<cstdio>3.#include<algorithm>4.#include<cstring>ing namespace std;6.struct P{int x,y;}p[55];7.//请仔细理解排序方式8.bool cmpx(P A,P B){return A.x<B.y||(A.x==B.x&&A.y<B.y);}9.bool cmpy(P A,P B){return A.y<B.y||(A.y==B.y&&A.x<B.x);}10.int n,k;11.int calc1(int L,int R){12.if(R-L<1) return 0;13.intl=p[L].x,r=p[L].x,u=p[L].y,d=p[L].y;//left,right,up,down14.for(int i=L+1;i<=R;i++){15.l=min(l,p[i].x),r=max(r,p[i].x);16.d=min(d,p[i].y),u=max(u,p[i].y);17.}18.return (r-l)*(u-d);19.}20.int calc2(int L,int R){21.if(R-L<2) return 0;22.int ans=calc1(L,R);23.sort(p+L,p+R+1,cmpx);24.for(int div=L;div<R;div++)25.ans=min(ans,calc1(L,div)+calc1(div+1,R));26.sort(p+L,p+R+1,cmpy);27.for(int div=L;div<R;div++)28.ans=min(ans,calc1(L,div)+calc1(div+1,R));29.return ans;30.}31.int calc3(int L,int R){32.P pp[55];33.if(R-L<3) return 0;34.int ans=calc1(L,R);35.sort(p+L,p+R+1,cmpx);36.memcpy(pp,p,sizeof(p));37.for(int div=L;div<R;div++){38.ans=min(ans,calc1(L,div)+calc2(div+1,R));39.memcpy(p,pp,sizeof(p));//调用了calc2会导致p[]乱序40.ans=min(ans,calc2(L,div)+calc1(div+1,R));41.memcpy(p,pp,sizeof(p));42.}43.sort(p+L,p+R+1,cmpy);44.memcpy(pp,p,sizeof(p));45.for(int div=L;div<R;div++){46.ans=min(ans,calc1(L,div)+calc2(div+1,R));47.memcpy(p,pp,sizeof(p));48.ans=min(ans,calc2(L,div)+calc1(div+1,R));49.memcpy(p,pp,sizeof(p));50.}51.return ans;52.}53.int calc4(int L,int R){54.if(R-L<4) return 0;55.P pp[55];56.int ans=calc1(L,R);57.sort(p+L,p+R+1,cmpx);58.memcpy(pp,p,sizeof(p));59.for(int div=L;div<R;div++){60.ans=min(ans,calc1(L,div)+calc3(div+1,R));61.memcpy(p,pp,sizeof(p));62.ans=min(ans,calc3(L,div)+calc1(div+1,R));63.memcpy(p,pp,sizeof(p));64.ans=min(ans,calc2(L,div)+calc2(div+1,R));65.memcpy(p,pp,sizeof(p));66.}67.sort(p+L,p+R+1,cmpy);68.memcpy(pp,p,sizeof(p));69.for(int div=L;div<R;div++){70.ans=min(ans,calc1(L,div)+calc3(div+1,R));71.memcpy(p,pp,sizeof(p));72.ans=min(ans,calc3(L,div)+calc1(div+1,R));73.memcpy(p,pp,sizeof(p));74.ans=min(ans,calc2(L,div)+calc2(div+1,R));75.memcpy(p,pp,sizeof(p));76.}77.return ans;78.}79.int main(){80.scanf("%d%d",&n,&k);81.for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);82.if(k==1) printf("%d\n",calc1(1,n));83.else if(k==2) printf("%d\n",calc2(1,n));84.else if(k==3) printf("%d\n",calc3(1,n));85.else printf("%d\n",calc4(1,n));86.return 0;87.}从代码中我们可以看到,calc就是不断划分并调用比它低级的calc的过程,而calc1为终点,其实这就是分治的过程个人总结:100+60+100+100=360T2:没有考虑搜索时的字符串会长度会超过20,导致RE。

NOIP2002

NOIP2002
一个整数(满足条件的个数):
[输入输出样例]:
输入:
234 2
2 5
3 6
输出:
4
题四过河卒(存盘名:NOIPC4)
[问题描述]:
如图,A点有一个过河卒,需要走到目标B点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图C点上的马可以控制9个点(图中的P1,P2…P8和C)。卒不能通过对方马的控制点。
3+7+12=223+7+19=297+12+19=383+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29)。
[输入]:
键盘输入,格式为:
n , k(1<=n<=20,k<n)
x1,x2,…,xn(1<=xi<=5000000)
[输出]:
屏幕输出,格式为:
一个整数(满足条件的种数)。
[输入输出样例]:
输入:
4 3
3 7 12 19
输出:
1
题三产生数(存盘名:NOIPC3)
[问题描述]:
给出一个整数n(n<10^30)和k个变换规则(k<=15)。
规则:
一位数可变换成另一个一位34。有规则(k=2):
2-> 5
3-> 6
[输入]
键盘输入k
[输出]
屏幕输出n
[输入输出样例]
输人:1
输出:2
题二选数(存盘名:NOIPC2)
[问题描述]:
已知n个整数x1,x2,…,xn,以及一个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOIP 2002年全国青少年信息学奥林匹克(计算机)题一均分纸牌(noip1.pas/c/cpp noipg1.in noipg1.out)[问题描述]有N 堆纸牌,编号分别为1,2,…, N。

每堆上有若干张,但纸牌总数必为N 的倍数。

可以在任一堆上取若干张纸牌,然后移动。

移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为N 的堆上取的纸牌,只能移到编号为N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

例如 N=4,4 堆纸牌数分别为:①9 ②8 ③17 ④ 6移动3次可达到目的:从③ 取 4 张牌放到④ (9 8 13 10) -> 从③ 取 3 张牌放到②(9 11 10 10)-> 从② 取 1 张牌放到①(10 10 10 10)。

[输入]:键盘输入文件名。

文件格式:N(N 堆纸牌,1 <= N <= 100)A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)[输出]:输出至屏幕。

格式为:所有堆均达到相等时的最少移动次数。

‘[输入输出样例]49 8 17 6屏慕显示:3题二字串变换(NOIPG2.pas/c/cpp noipg2.in noipg2.out)[问题描述]:已知有两个字串A$, B$ 及一组字串变换的规则(至多6个规则):A1$ -> B1$A2$ -> B2$规则的含义为:在A$中的子串A1$ 可以变换为B1$、A2$ 可以变换为B2$ …。

例如:A$='abcd'B$='xyz'变换规则为:‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’则此时,A$ 可以经过一系列的变换变为B$,其变换的过程为:‘abcd’->‘xud’->‘xy’->‘xyz’共进行了三次变换,使得A$ 变换为B$。

[输入]:键盘输人文件名。

文件格式如下:A$ B$A1$ B1$ \A2$ B2$ |-> 变换规则... ... /所有字符串长度的上限为 20。

[输出]:输出至屏幕。

格式如下:若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"[输入输出样例]b.in:abcd xyzabc xuud yy yz屏幕显示:3题三自由落体(NOIPG3.pas/c/cpp noipg3.in noipg3.out)[问题描述]:在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。

在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。

已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。

地面上的小车以速度 V 前进。

如下图:小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小球落到地面后不能被接受)。

请你计算出小车能接受到多少个小球。

[输入]:键盘输人:H,S1,V,L,K,n (l<=H,S1,V,L,K,n <=100000)[输出]:屏幕输出:小车能接受到的小球个数。

[输入输出样例][输入]:5.0 9.0 5.0 2.5 1.8 5[输出]:1题四矩形覆盖(NOIPG4.pas/c/cpp noipg4.in noipg4.out)[问题描述]:在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。

例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一。

这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴。

当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。

问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。

约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。

各个矩形必须完全分开(边线与顶点也都不能重合)。

[输入]:键盘输人文件名。

文件格式为n kxl y1x2 y2... ...xn yn (0<=xi,yi<=500)[输出]:输出至屏幕。

格式为:一个整数,即满足条件的最小的矩形面积之和。

[输入输出样例]d.in :4 21 12 23 60 7屏幕显示:4参考程序:第一题:varf:array[0..101]of longint;tot,t,n,i,yu:longint;beginassign(input,'noipg1.in');reset(input); assign(output,'noipg1.out');rewrite(output); readln(n);tot:=0;for i:=1 to n dobeginread(f[i]);tot:=tot+f[i];end;tot:=tot div n;yu:=0; t:=0;for i:=1 to n-1 dobeginif f[i]>tot thenbeginyu:=f[i]-tot;f[i+1]:=f[i+1]+yu;inc(t);endelseif f[i]<tot thenbeginyu:=f[i]-tot;f[i+1]:=f[i+1]+yu;inc(t);end;end;write(t);close(input);close(output);end.第二题:constmaxm=400009;varmap:array[1..6,1..2]of string;d:array[1..10000]of string;step:array[1..10000]of longint;ha:array[0..400009]of integer;a,b,s1,s2,st:string;tot,p,i,l,r,k:longint;procedure init;beginreadln(b); p:=pos(' ',b); a:=copy(b,1,p-1); delete(b,1,p); tot:=0;repeatreadln(s2); p:=pos(' ',s2);s1:=copy(s2,1,p-1); delete(s2,1,p);inc(tot); map[tot,1]:=s1;map[tot,2]:=s2; until eof(input);end;function bkdrhash(st:string):longint;vari,hash,g:longint;beginhash:=0;for i:=1 to length(st) dobeginhash:=(hash shl 4)+ord(st[i]);g:=hash and $f0000000;if g<>0 then hash:=hash xor(g shr 24);hash:=hash and(not g);end;exit(hash mod maxm);end;procedure bfs;begind[1]:=a;step[1]:=0;l:=0;r:=1;while (l<r)and(step[l+1]<10)dobegininc(l);for i:=1 to tot dobegins1:=d[l];p:=pos(map[i,1],s1);while p<>0 dobeginst:=d[l];delete(st,p,length(map[i,1]));insert(map[i,2],st,p);k:=bkdrhash(st);if ha[k]<>0 thenbegins1[p]:=' ';p:=pos(map[i,1],s1);continue;end;ha[k]:=1;inc(R);d[r]:=st;step[r]:=step[l]+1;if st=b thenbeginwriteln(step[r]);close(input);close(output);halt;end;s1[p]:=' ';p:=pos(map[i,1],s1);end;end;end;writeln('NO ANSWER!');end;beginassign(input,'noipg2.in');reset(input);assign(output,'noipg2.out');rewrite(output); init;bfs;close(input);close(output);end.第三题:varh,s1,v,t1,t2,l,k:real;x,n,n1,n2:longint;beginassign(input,'noipg3.in');reset(input);assign(output,'noipg3.out');rewrite(output); read(h,s1,v,l,k,n);t1:=sqrt(2*h/10);x:=-1;if h<=k+0.00001 then t2:=0else t2:=sqrt(2*(h-k-0.00001)/10);if s1-v*t2+l+0.00001<0 then x:=0else n2:=trunc(s1-v*t2+l+0.00001);if n2>n-1 then n2:=n-1;if s1-v*t1-0.00001<=0 then n1:=0elseif s1-v*t1-0.00001>n-1 then x:=0elseif (s1-v*t1-0.00001)=trunc(s1-v*t1-0.00001)then n1:=trunc(s1-v*t1-0.00001) else n1:=trunc(s1-v*t1-0.00001)+1;if x=-1 then x:=n2-n1+1;write(x);close(input);close(output);end.第四题:constmaxn=500;typearr=array[0..maxn,1..2]of longint;varmax,min,t,n,k,i,j,l:longint;a:arr;f:array[0..maxn]of longint;procedure sort(var x:arr);vari,j,m:longint;t1,t2,t3:longint;beginfor i:=1 to n-1 dobegint1:=x[i,1]; t2:=x[i,2];t3:=t2; m:=i;for j:= i+1 to n doif t3>x[j,2] thenbeginm:=j;t3:=x[j,2];end;if m<>i thenbeginx[i,1]:=x[m,1];x[i,2]:=x[m,2];x[m,1]:=t1;x[m,2]:=t2end;end;end;function maxy(x1,x2:longint):longint;vari,max:integer;beginmax:=-maxlongint;for i:=x1 to x2 do if max<a[i,1] then max:=a[i,1];exit(max);end;function miny(x0,xn:longint):longint;vari,min:longint;beginmin:=maxlongint;for i:=x0 to xn do if min>a[i,1]then min:=a[i,1];exit(min);end;beginassign(input,'noipg4.in'); reset(input);assign(output,'noipg4.out'); rewrite(output);readln(n,k);for i:=1 to n do readln(a[i,1],a[i,2]);sort(a);fillchar(f,sizeof(f),0);max:=(a[n,2]-a[1,2])*(maxy(1,n)-miny(1,n));for i:=1 to n do f[i]:=(a[i,2]-a[1,2])*(maxy(1,i)-miny(1,i));for i:=2 to k dofor j:= n downto 1 dobeginmin:=max;for l:=i-1 to j-1 dobegint:=f[l]+(a[j,2]-a[l+1,2])*(maxy(l+1,j)-miny(l+1,j));if (t<min)and(a[l,2]<>a[l+1,2])then min:=t;end;f[j]:=min;end;write(f[n]);close(input); close(output);end.。

相关文档
最新文档