2000年青少年信息学奥赛提高组复赛
题一 进制转换 (18分)<br><br>问题描述<br> 我们可以用这样的方式来表示一个十进制数,将每个阿拉伯数字乘以一个该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式。与之类似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被用来作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为0,1,……R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5,6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码,通常是用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。在负进制中是用-R作为基数,例如-15(十进制)相当于110001(-2进之),并且它可以被表示为2的幂级数的和数:<br> 110001=1*(-2)5+1*(-2)4+0*(-2)3+0*(-2)2+0*(-2)1+1*(-2)0<br>问题求解:<br> 设计一个程序,读入一个十进制数和一个负进制的基数,并将此十进制数转换成为此负进制下的数: -R∈{ -2,-3,-4,......-20 }<br>输入:<br> 输入的每行有两个输入数据。<br> 第一个是十进制数N(-32768<=N<=32767):第二个是负进制数的基数-R。<br>输出:<br> 结果显示在屏幕上,相对于输入,应输出此负进制数及其基数,若此基数超过10,则参照16进制的方式处理。<br>样例:<br>输入<br>30000 -2<br>-20000 -2<br>28800 -16<br>-25000 -16<br>输出<br>30000=11011010101110000 (base -2)<br>-20000=1111011000100000 (base -2)<br>28800=19180 (base -16)<br>-25000=7FB8 (base -16) <br><br><br>提高组 题二 乘积最大 (22分)<br><br>问题描述:<br> 今年是国际数学联盟确定的\"2000--世界数学年\",又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手除了这样一道题目:<br> 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1部分的乘积能够为最大。<br> 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:<br> 有一个数字川:312,当N=3,K=1时会有一下两种分法:<br>1) 3*12=36<br>2) 31*2=62<br> 这时,符合题目要求的结果是;31*2=62<br> 现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。 <br>输入:<br> 程序的输入共有两行:<br> 第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)<br> 第二行是一个长度为N的数字串。<br>输出:<br> 结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。<br>样例:<br>输入<br>4 2<br>1231<br>输出<br>36 <br><br><br>提高组 题三 单词接龙 (27分)<br><br>问题描述:<br> 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母要求出以这个字符开头的最长的\"龙\"(每个单词都最多在\"龙\"中出现两次),在两个单词相连是,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。<br>输入:<br>输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表示\"龙\"开头的字母。你可以假定以此字母开头的\"龙\"一定存在。<br>输出:<br> 只需输出以此字母开头的最长的\"龙\"的长度<br>样例:<br>输入<br>5<br>at<br>touch<br>cheat<br>choose<br>tact<br>a<br>输出<br>23 (连成的\"龙\"为atoucheatactactouchoose) <br><br><br>提高组 题四 方格取数 (33分)<br><br>问题描述:<br> 设有N*N的方格图(N<=8),我们将其中的某些方格中填入正整数,二其他的方格中则放入数字0。如下图所示(见样例):<br> ->向右<br>A 1 2 3 4 5 6 7 8 <br>1 0 0 0 0 0 0 0 0 <br>2 0 0 13 0 0 6 0 0 <br>3 0 0 0 0 7 0 0 0 <br>4 0 0 0 14 0 0 0 0 <br>5 0 21 0 0 0 5 0 0 <br>6 0 0 15 0 0 0 0 0 <br>7 0 14 0 0 0 0 0 0 <br>8 0 0 0 0 0 0 0 0 <br> B <br><br><br> 某人从图的左上角的A点出发,可以向下行走,也可以向右走,知道到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。<br> 此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。<br>输入:<br> 输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。<br>输出:<br> 只需输出一个整数,表示2条路径上取得的最大的和。<br>样例:<br>输入<br>8<br>2 3 13<br>2 6 6<br>3 5 7<br>4 4 14<br>5 2 21<br>5 6 4<br>6 3 15<br>7 2 14<br>0 0 0<br>输出<br>67<br><br>测试数据:up/1091195875.rar<br>试题解答:up/1091195896.rar<br>页:
[1]