《NOIP历复赛提高组试题..doc》由会员分享,可在线阅读,更多相关《NOIP历复赛提高组试题..doc(74页珍藏版)》请在三一办公上搜索。
1、第十届全国信息学奥林匹克分区联赛(NOIP2004)复赛试题(提高组 竞赛用时:3小时)1、津津的储蓄计划(Save.pasdprccpp)【问题描述】津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。例如11月初津津手中还有83元,妈妈给了津津30
2、0元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20还给津津之后,津津手中会有多少钱。【输入文件】输入文件save.in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到
3、12月津津的预算。【输出文件】输出文件save.out包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。【样例输入1】29023028020030017034050908020060【样例输出1】-7【样例输入2】29023028020030017033050908020060【样例输出2】15802、合并果子(fruit.pasdprccpp)【问题描述】在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多
4、可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明
5、15为最小的体力耗费值。【输入文件】输入文件fruit.in包括两行,第一行是一个整数n(1n=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1ai=20000)是第i种果子的数目。【输出文件】输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。【样例输入】3129【样例输出】15【数据规模】对于30的数据,保证有n=1000:对于50的数据,保证有n=5000;对于全部的数据,保证有n=10000。3、合唱队形(chorus.pasdprccpp)【问题描述】N位同学站成一排,音乐老师要请其中的(N
6、-K)位同学出列,使得剩下的K位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,K,他们的身高分别为T1,T2,TK,则他们的身高满足T1.Ti+1TK(1=i=K)。你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。【输入文件】输入文件chorus.in的第一行是一个整数N(2=N=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130=Ti=230)是第i位同学的身高(厘米)。【输出文件】输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。【样例输入】81
7、86 186 150 200 160 130 197 220【样例输出】4【数据规模】对于50的数据,保证有n=20;对于全部的数据,保证有n=100。4、虫食算(alpha.pas/dpr/c/cpp)【问题描述】所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:43#9865#045+8468#663344445509678其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。现在,我们对问题做两个限制:首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,
8、允许有前导的0。其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。BADC+CBDADCCC上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,【输入文件】输入文件alpha
9、.in包含4行。第一行有一个正整数N(N=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。【输出文件】输出文件alpha.out包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。【样例输入】5ABCEDBDACEEBBAA【样例输出】10342【数据规模】对于30的数据,保证有N10;对于50的数据,保证有N15;对于全部的数据,保证有N80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;2)
10、五四奖学金,每人4000元,期末平均成绩高于85分(85),并且班级评议成绩高于80分(80)的学生均可获得;3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(90)的学生均可获得;4) 西部奖学金,每人1000元,期末平均成绩高于85分(85)的西部省份学生均可获得;5) 班级贡献奖,每人850元,班级评议成绩高于80分(80)的学生干部均可获得;只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。现在给出若干
11、学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。【输入文件】输入文件scholar.in的第一行是一个整数N(1 = N = 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项
12、之间用一个空格分隔。【输出文件】输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。【样例输入】4YaoLin 87 82 Y N 0ChenRuiyi 88 78 N Y 1LiXin 92 88 N N 0ZhangQin 83 87 Y N 1【样例输出】ChenRuiyi9000287002、过河(river.pas/c/cpp) 【问题描述】在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥
13、上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。【输入文件】输入文件river.in的第一行有一个正整数L(1 = L = 109),表示独木桥的长度。第
14、二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 = S = T = 10,1 = M = 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。【输出文件】输出文件river.out只包括一个整数,表示青蛙过河最少需要踩到的石子数。【样例输入】102 3 52 3 5 6 7 【样例输出】2 【数据规模】对于30%的数据,L = 10000;对于全部的数据,L = 109。3、篝火晚会(fire.pas/c/cpp)【问题描述】佳佳刚进高中,在军训的时候,由于佳佳吃
15、苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有n个同学,编号从1到n。一开始,同学们按照1,2,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。佳佳可向同学们下达命令,每一个命令的形式如下:(b1, b2,. bm -1, bm)这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1,b2, bm 1,bm的这m个同学的位置。要求b1换到b2的位置上,b2换到b3的位置上,要求bm换到b1的位置上。执行
16、每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?【输入文件】输入文件fire.in的第一行是一个整数n(3 = n = 50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,编号是n的同学最希望相邻的两个同学的编号。【输出文件】输出文件fire.out包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。【样例输入】43 44
17、 31 21 2【样例输出】2【数据规模】对于30%的数据,n = 1000;对于全部的数据,n = 50000。4、等价表达式(equal.pas/c/cpp) 【问题描述】明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?这个选择题中的每个表达式都满足下面的性质:1 表达式只可能包含一个变量a。2
18、表达式中出现的数都是正整数,而且都小于10000。3 表达式中可以包括四种运算+(加),-(减),*(乘),(乘幂),以及小括号(,)。小括号的优先级最高,其次是,然后是*,最后是+和-。+和-的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符+,-,*,以及小括号(,)都是英文字符)4 幂指数只可能是1到10之间的正整数(包括1和10)。5 表达式内部,头部或者尾部都可能有一些多余的空格。下面是一些合理的表达式的例子:(a1) 2)3,a*a+a-a,(a+a),9999+(a-a)*a,1 + (a -1)3,1109【输入文件】输入文件equal.in的第一行给出的是题干中的
19、表达式。第二行是一个整数n(2 = n = 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D输入表达式的长度都不超过50个字符,且保证选项中总有表达式和题干中的表达式是等价的。【输出文件】输出文件equal.out包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。【样例输入】( a + 1) 23(a-1)2+4*aa + 1+ aa2 + 2 * a * 1 + 12 + 10 -10 +a a【样例输出】AC【数据规模】对于30%的数据,表达式中只可能出现两种运算符+和
20、-;对于其它的数据,四种运算符+,-,*,在表达式中都可能出现。对于全部的数据,表达式中都可能出现小括号(和)。第十二届全国信息学奥林匹克分区联赛(NOIP2006)复赛试题(提高组 竞赛用时:3小时)关于竞赛中不同语言使用限制的说明一关于使用Pascal语言与编译结果的说明1对于Pascal语言的程序,当使用IDE和fpc编译结果不一致时,以fpc的编译结果为准。2允许使用数学库(usesmath子句),以及ansistring。但不允许使用编译开关(最后测试时pascal的范围检查开关默认关闭:$R-,Q-,S-),也不支持与优化相关的选项。二关于C+语言中模板使用的限制说明1允许使用的部
21、分:标准容器中的布尔集合,迭代器,串,流。相关的头文件:2禁止使用的部分:序列:vector,list,deque序列适配器:stack,queue,priority_queue关联容器:map,multimap,set,multiset拟容器:valarray散列容器:hash_map,hash_set,hash_multimap,hash_multiset所有的标准库算法相关头文件:1能量项链(energy.pas/c/cpp)【问题描述】在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于
22、相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m*r*n(Mars单位),新产生的珠子的头标记为m,尾标记为n。需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3
23、) (3,5) (5,10) (10,2)。我们用记号表示两颗珠子的聚合操作,(jk)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为:(41)=10*2*3=60。这一串项链可以得到最优值的一个聚合顺序所释放的总能量为(41)2)3)=10*2*3+10*3*5+10*5*10=710。【输入文件】输入文件energy.in的第一行是一个正整数N(4N100),表示项链上珠子的个数。第二行是N个用空格隔开的正整数,所有的数均不超过1000。第i个数为第i颗珠子的头标记(1iN),当iN时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。第N颗珠子的尾标记应该等于
24、第1颗珠子的头标记。至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。【输出文件】输出文件energy.out只有一行,是一个正整数E(E2.1*109),为一个最优聚合顺序所释放的总能量。【输入样例】42 3 5 10【输出样例】7102金明的预算方案(budget.pas/c/cpp)【问题描述】金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的
25、物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主 件附 件电脑打印机,扫描仪书柜图书书桌台灯,文具工作椅无如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有0个、1个或2个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数15表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是10元的整数倍)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j件物品的价格为vj,重要度为wj,共选中了k件物品,编号依次为j1,j2
26、,jk,则所求的总和为:vj1*wj1+vj2*wj2+ +vjk*wjk。(其中*为乘号)请你帮助金明设计一个满足要求的购物单。【输入文件】输入文件budget.in 的第1行,为两个正整数,用一个空格隔开:n m(其中N(32000)表示总钱数,m(60)为希望购买物品的个数。)从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,每行有3个非负整数v p q(其中v表示该物品的价格(v0,表示该物品为附件,q是所属主件的编号)【输出文件】输出文件budget.out只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(200000)。【输入样例】1000 580
27、0 2 0400 5 1300 5 1400 3 0500 2 0【输出样例】22003作业调度方案(jsp.pas/c/cpp)【问题描述】我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。每个工件的每个工序称为一个操作,我们用记号j-k表示一个操作,其中j为1到n中的某个数字,为工件号;k为1到m中的某个数字,为工序号,例如2-4表示第2个工件第4道工序的这个操作。在本题中,我们还给定对于各操作的一个安排顺序。例如,当n=3,m=2时,“1-1,1-2,2-1,3-1,3-2,2-2”就是一个给定的安排顺序,
28、即先安排第1个工件的第1个工序,再安排第1个工件的第2个工序,然后再安排第2个工件的第1个工序,等等。一方面,每个操作的安排都要满足以下的两个约束条件。(1) 对同一个工件,每道工序必须在它前面的工序完成后才能开始;(2) 同一时刻每一台机器至多只能加工一个工件。另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为“1 1 2 3 3 2”。还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排
29、在后面的某个操作比前面的某个操作先完成。例如,取n=3,m=2,已知数据如下:工件号机器号/加工时间工序1工序211/32/221/22/532/21/4则对于安排顺序“1 1 2 3 3 2”,下图中的两个实施方案都是正确的。但所需要的总时间分别是10与12。当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一个空档),可以靠前插入,也可以靠后或居中插入。为了使问题简单一些,我们约定:在保证约束条件(1)(2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以插入,就在保证约束条件(1)(2)的条件下,插入到最前面的一个空档。于是,在这些约定下,上例中的
30、方案一是正确的,而方案二是不正确的。显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请你计算出该方案完成全部任务所需的总时间。【输入文件】输入文件jsp.in 的第1行为两个正整数,用一个空格隔开:m n(其中m(20)表示机器数,n(20)表示工件数)第2行:个用空格隔开的数,为给定的安排顺序。接下来的2n行,每行都是用空格隔开的m个正整数,每个数不超过20。其中前n行依次表示每个工件的每个工序所使用的机器号,第1个数为第1个工序的机器号,第2个数为第2个工序机器号,等等。后n行依次表示每个工件的每个工序的加工时间。可以保证,以上各数据都是正确的,不必检验。【输出文
31、件】输出文件jsp.out只有一个正整数,为最少的加工时间。【输入样例】2 31 1 2 3 3 21 2 1 2 2 13 2 2 5 2 4【输出样例】1042k进制数(digital.pas/c/cpp)【问题描述】设r是个2k 进制数,并满足以下条件:(1)r至少是个2位的2k 进制数。(2)作为2k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。(3)将r转换为2进制数q后,则q的总位数不超过w。在这里,正整数k(1k9)和w(kw30000)是事先给定的。问:满足上述条件的不同的r共有多少个?我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0
32、”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k的段,每段对应一位2k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2k 进制数r。例:设k=3,w=7。则r是个八进制数(23=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,高位为6:1个(即67)。共6+5+1=21个。3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,第2位
33、为6:1个(即167)。共5+4+1=15个。所以,满足要求的r共有36个。【输入文件】输入文件digital.in只有1行,为两个正整数,用一个空格隔开:k w【输出文件】输出文件digital.out为1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。(提示:作为结果的正整数可能很大,但不会超过200位)【输入样例】3 7【输出样例】36第十三届全国信息学奥林匹克分区联赛(NOIP2007)复赛试题(提高组 竞赛用时:3小时)说明:1.文件名(程序名和输入输出文件名)必须
34、使用小写2.C/C+中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。3.全国统一评测时采用的机器参考配置为:CPU2.0GHz,内存256M。1、统计数字(count.pas/c/cpp)【问题描述】某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。【输入】输入文件count.in包含n+1行;第一行是整数n,表示自然数的个数;第2n+1每行一个自然数。【输出】输出文件count.out包含m行(m为n个自然数中不相同数
35、的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。【输入输出样例】count.incount.out82424510021002 34 25 1100 2【限制】40%的数据满足:1=n=100080%的数据满足:1=n=50000100%的数据满足:1=n=200000,每个数均不超过1500 000 000(1.5*109)2、字符串的展开(expand.pas/c/cpp)【问题描述】在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它
36、当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:(1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。(2)参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。(3)
37、参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。(4)参数p3:是否改为逆序:p3=1表示维持原来顺序,p3=2表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。(5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-
38、d”,“3-1”应输出为“3-1”。【输入】输入文件expand.in包括两行:第1行为用空格隔开的3个正整数,一次表示参数p1,p2,p3。第2行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。【输出】输出文件expand.out只有一行,为展开后的字符串。【输入输出样例1】expand.inexpand.out1 2 1abcs-w1234-9s-4zzabcsttuuvvw1234556677889s-4zz【输入输出样例2】expand.inexpand.out2 3 2a-d-daCCCBBBd-d【输入输出样例3】expand.inexpand.out3 4
39、2di-jkstra2-6dijkstra2*6【限制】40%的数据满足:字符串长度不超过5100%的数据满足:1=p1=3,1=p2=8,1=p3=2。字符串长度不超过1003、矩阵取数游戏(game.pas/c/cpp)【问题描述】帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有的元素;2.每次取走的各个元素只能是该元素所在行的行首或行尾;3.每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素值*2i,其中i表示第i次取数(从1开始编号
40、);4. 游戏结束总得分为m次取数得分之和。帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。【输入】输入文件game.in包括n+1行;第一行为两个用空格隔开的整数n和m。1+2+(2+3)*4+8*6第2n+1行为n*m矩阵,其中每行有m个用单个空格隔开【输出】输出文件game.out仅包含1行,为一个整数,即输入矩阵取数后的最大的分。【输入输出样例1】game.ingame.out2 31 2 33 4 282【输入输出样例1解释】第1次:第一行取行首元素,第二行取行尾元素,本次的氛围1*21+2*21=6第2次:两行均取行首元素,本次得分为2*22+3*22=20第3次
41、:得分为3*23+4*23=56。总得分为6+20+56=82【输入输出样例2】game.ingame.out1 44 5 0 5122【输入输出样例3】game.ingame.out2 1096 56 54 46 86 12 23 88 80 4316 95 18 29 30 53 88 83 64 67316994【限制】60%的数据满足:1=n, m=30,答案不超过1016100%的数据满足:1=n, m=80,0=aij=10004、树网的核(core.pas/c/cpp)【问题描述】设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为
42、树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并设T有n个结点。路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a, b)表示以a, b为端点的路径的长度,它是该路径上各边长度之和。我们称d(a, b)为a, b两结点间的距离。D(v, P)=mind(v, u), u为路径P上的结点。树网的直径:树网中最长的路径成为树网的直径。对于给定的树网T,直径不一定是唯一的,但可以证明:各直径的中点(不一定恰好是某个结点,可能在某条边的内部)是唯一的,我们称该点为树网的中心。偏心距ECC(F):树网T中距路径F最远的结点到路径F的距离,即ECC(F
43、)=maxd(v, F),vV任务:对于给定的树网T=(V, E, W)和非负整数s,求一个路径F,他是某直径上的一段路径(该路径两端均为树网中的结点),其长度不超过s(可以等于s),使偏心距ECC(F)最小。我们称这个路径为树网T=(V, E, W)的核(Core)。必要时,F可以退化为某个结点。一般来说,在上述定义下,核不一定只有一个,但最小偏心距是唯一的。下面的图给出了树网的一个实例。图中,A-B与A-C是两条直径,长度均为20。点W是树网的中心,EF边的长度为5。如果指定s=11,则树网的核为路径DEFG(也可以取为路径DEF),偏心距为8。如果指定s=0(或s=1、s=2),则树网的
44、核为结点F,偏心距为12。【输入】输入文件core.in包含n行:第1行,两个正整数n和s,中间用一个空格隔开。其中n为树网结点的个数,s为树网的核的长度的上界。设结点编号以此为1,2,n。从第2行到第n行,每行给出3个用空格隔开的正整数,依次表示每一条边的两个端点编号和长度。例如,“2 4 7”表示连接结点2与4的边的长度为7。所给的数据都是争取的,不必检验。【输出】输出文件core.out只有一个非负整数,为指定意义下的最小偏心距。【输入输出样例1】core.inCore.out5 21 2 52 3 22 4 42 5 35【输入输出样例2】core.incore.out8 61 3 22 3 2 3 4 64 5 34 6 44 7 27