[A] Game Show Math
在英国有一个数学游戏,给参赛者一些正整数和一个目标数,参赛者必须在这些正整数间插入+、-、*或/ 的符号,使得最后计算的结果等于目标数。计算的方式是由左到右,而且不必管运算的优先顺序(就是不管先乘除后加减那一套)。
在这个数学运算式中,有三个限制:
- 正整数出现的次序不可改变,也就是要与输入的顺序相同
- 因为目标数也是一个正整数,所以在运算的过程中,你只有在可以整除的情况下才可以使用/ 。
- 在运算的过程中,如果你用某一个运算符号,会导致产生的数超出(-32000 ~ +32000)的范围,那么你不可以采用此运算符号。(也就是说在运算的过程中都不该有超出范围的数出现)
Input
第一列有1个整数n,代表接下来有多少组测试资料。
每组测试资料一列。每列的第一个整数p(0 < p <= 100),代表要做运算的数有多少个。接下来有p个正整数,每列的最后一个数为目标数。所有的数都小于32000。
请参考Sample Input。
Output
每列测试资料输出一列运算式,使得输入的p个正整数运算的结果等于目标数。如果找不到这样的运算式,请输出"NO EXPRESSION"。如果有多组运算式可以达成任务,请输出任何一组均可。
请参考Sample Output。
Sample Input
3 3 5 7 4 3 2 1 1 2000 5 12 2 5 1 2 4
Sample Output
5+7/4=3 NO EXPRESSION 12-2/5*1*2=4
[B] Fermat vs. Pythagoras
著名的费马大定理是指:当n>2时,x n +y n =z n 无整数解,这边我们要处理的问题跟费马大定理有点关系。 给你一个正整数N,你的任务是算出两个与方程式x 2 +y 2 =z 2的解相关的数字。( 0 < x < y < z <= N ) 第一个数字是互质的数对(triples)
(x,y,z)数目。互质是指x、y、z没有大于1的公因数。第二个数字p是在小于等于N的数字内不属于任何数对(x,y,z)的正整数总数,这边x、y、z不需要互质。 例如,N=10,可找到一组互质数对(3,4,5)及一组不互质的数对(6,8,10), 1、2、7、9共4个数字没用到。所以N=10要输出1与4。
Input
输入含有多组测试资料,每组测试资料一列,有一个正整数N (1 <= N <= 1000000)
Output
输出一列,含两个整数,如题目所述,数字中间以一个空白字元分隔。
Sample Input | Sample Output |
10 25 100 500 1000000 |
1 4 4 9 16 27 80 107 159139 133926 |
Translated by Latinboy
[C] Master-Mind Hints
Master-Mind是一种2个人的游戏。其实就是学生常玩的几A几B的游戏(规则或许有些许不同)。其中一个人担任出题者,他选一串1到9数字当作密码(可以重复)。另一个人为解题者,他要去猜密码为何。解题者每次猜测后,出题者以某种格式回答他这次猜的结果。
在游戏开始之前,双方先协议密码的长度,假设是n。在出题者设定密码(s 1 ,s 2 ,...s n)后,由解题者来猜(g 1 ,g 2 ,...g n)。如果同样位置g i =s i,那解题者得到一个A。如果gi =s j,但i不等于j,那解题者得到一个B。请注意:不管是得A或得B,每个g i最多只能对应到一个s j,而且得A比得B优先。举例说明:密码为1 2 3 4,若猜题者猜1 1 5 6,那出题者应该回答1A0B,而不是0A1B。
如果某个猜测得到nA0B,那就代表猜题者完全猜中密码了。
Input
输入含有多组测试资料。每组测试资料的第一列含有1个正整数N(N <= 1000),代表密码的长度。第二列有N个1到9的数字,代表密码。接下来有数量不等的猜测,每个一列,亦含有N个1到9的数字。若此猜测的N个数字均为0,代表此组测试资料结束。
N=0代表整个输入结束。请参考Sample Input。
Output
对每一组测试资料,输出这是第几组。然后输出出题者回答猜题者各个猜测的结果是几A几B,以(A,B)的形式表示。请参考Sample Output。
Sample Input
4 1 3 5 5 1 1 2 3 4 3 3 5 6 5 5 1 6 1 3 5 1 3 5 5 0 0 0 0 10 1 2 2 2 4 5 6 6 6 9 1 2 3 4 5 6 7 8 9 1 1 1 2 2 3 3 4 4 5 5 1 2 1 3 1 5 1 6 1 9 1 2 2 5 5 5 6 6 6 7 0 0 0 0 0 0 0 0 0 0 0
Sample Output
Game 1: (1,1) (2,0) (1,2) (1,2) (4,0) Game 2: (2,4) (3,2) (5,0) (7,0)
[D] Myacm Triangles
在古代的Myacm文化中,考古学家发现存在有一些柱子(从4到15根),这些柱子形成的区域称为力场。然而,大部分的古文物都被发现存在于一种power triangle中,也就是位于3根柱子形成的区域,并且在这个区域中(包括边线)没有任何其他的柱子存在,而且这块区域的面积是所有符合前面条件的区域中最大的一块。每一个力场只会有一个power triangle。
现在你的任务就是给你这些柱子的座标资料,要请你帮助考古学家们找到power triangle。
给你一个很有用的公式: ( x 1 , y 1 ), ( x 2 , y 2 ), ( x 3 , y 3 )此3个点所形成的面积为以下式子的绝对值。
0.5 × [( y 3 - y 1 )( x 2 - x 1 ) - ( y 2 - y 1 )( x 3 - x 1 )]
Input
每组测试资料的第1列有1个整数n(4 <= n <= 15),代表此力场中柱子的数目。接下来的n列每列有柱子的编号及座标。柱子的编号从A开始,所有的座标值均是介于0~99的整数。n=0时代表输入结束。最上方的图形即为Sample Input的第1组测试资料。
Output
对每组测试资料请输出形成power triangle的3根柱子的编号,按编号有小到大。
Sample Input
6 A 1 0 B 4 0 C 0 3 D 1 3 E 4 4 F 0 6 4 A 0 0 B 1 0 C 99 0 D 99 99 0
Sample Output
BEF BCD
[E] Tree Summing
LISP是最早的高阶程式语言之一,而Lists则是LISP中最重要的资料结构。Lists可以很简单的用来表达其他的资料结构,例如:tree。在这个问题中,给你LISP中的S表示式(S-expression),请你写一个程式判断这表示式(整数的二元树)是否存在一条由根节点到树叶的路径,且路径上各节点的值的和为某一特定的数n。例如:在以下的树中共有4条从根到树叶的路径。而各路径的和分别为27,22,26以及18。
在LISP中的S表示式有以下的格式:
empty tree ::= ()
tree ::= empty tree | (integer tree tree)
上图中的树若以S表示式表达为:(5 (4 (11 (7 () ()) (2 () ()) ) ()) (8 (13 () ()) (4 () (1 () ()) ) ) )
注意:在树中所有的叶节点为(integer () () )
既然空树不存在任何根到叶的路径,任何对空树是否有某个和的询问,其答案都是否定的。
Input
输入含有多组测试资料。每组测试资料的开头有一个整数n。接下来为一S表示式。所有的S表示式一定是合法的,但是可能会跨多列,并且可能含有空白字元。请参考Sample Input。
Output
对每一组测试资料输出一列。如果S表示式所表达的树存在一条由根到叶的路径,且路径上节点值的和为n的话,则输出yes,否则输出no。
Sample Input
22 (5(4(11(7()())(2()()))()) (8(13()())(4()(1()())))) 20 (5(4(11(7()())(2()()))()) (8(13()())(4()(1()())))) 10 (3 (2 (4 () () ) (8 () () ) ) (1 (6 () () ) (4 () () ) ) ) 5 ()
Sample Output
yes no yes no
[F] Matrix Chain Multiplication
假设你必须做A*B*C*D*E的运算,在这里A,B,C,D,E都是矩阵(matrix)。由于矩阵相乘具有连结性(associative),所以相乘的顺序可以是任意的。然而所需要的基本乘法数却与不尽相同。
例如:A是个50*10的矩阵,B是个10*20的矩阵,C是个20*5的矩阵。那么就有2种不同的表示式来求出A*B*C。分别是(A*B)*C和A*(B*C)。而其所需用到的基本乘法数前者为15000次,后者为3500次。
给你某一种矩阵相乘的表示式,你的任务是写一个程式算出需要多少个基本乘法。
Input
输入分为2部分。第一部份为矩阵的资料,第二部分为矩阵相乘的表示式。
第一列有一个整数n(1<= n <= 26),代表在输入的第一部份有多少个矩阵。接下来的n列每列为一矩阵的资料。内容为1个大写英文字母及2个整数,分别代表矩阵的名字,栏数(rows)及列数(columns)。
输入的第二部分每列为一测试资料,内容为矩阵相乘的表示式。表示式严格的遵守以下的语法(以EBNF的形式)
SecondPart = Line { Line } <EOF> Line = Expression <CR> Expression = Matrix | "(" Expression Expression ")" Matrix = "A" | "B" | "C" | ... | "X" | "Y" | "Z"
请参考Sample Input。
Output
对输入第二部分的每组测试资料输出一列。如果该表示式为不合法的矩阵相乘,则输出error。否则请输出此表示式所需的乘法次数。请参考Sample Output。
Sample Input
9 A 50 10 B 10 20 C 20 5 D 30 35 E 35 15 F 15 5 G 5 10 H 10 20 I 20 25 A B C (AA) (AB) (AC) (A(BC)) ((AB)C) (((((DE)F)G)H)I) (D(E(F(G(HI))))) ((D(EF))((GH)I))
Sample Output
0 0 0 error 10000 error 3500 15000 40500 47500 15125
[G] Shoemaker's Problem
鞋匠有N件工作要完成。他每天只能做一件工作。并且他知道这些工作分别要几个工作天才能完成。另外,他也知道每个工作被延误一天所需被罚的罚金。延误的天数为从今天算起到该工作开始的那天(所以只有第一件工作没有罚金)。
以第一组测试资料为例说明:若工作的顺序是1 2 3 4,那罚金为:0*4+1000*3+4*2+6*5=3038。若工作的顺序是2 1 3 4,则罚金为:0*1000+1*4+4*2+6*5=42。所以第二种工作顺序的罚金较少(事实上也是最少)。
你的任务是写一个程式帮助鞋匠找出完成这N个工作的先后顺序,使得罚金最少。
Input
输入的第一列有一个整数代表以下有几组测试资料。
每组测试资料的第一列,含有一个整数N(1 <= N <=1000),代表鞋匠需完成的工作数。接下来的N列每列有2个整数,分别代表该工作完成所需的天数以及延迟一天的罚金多少(均大于等于1,小于等于1000)。
第一列和第一组测试资料间,以及各组测试资料间均有一空白列。请参考Sample Inout。
Output
对每组测试资料输出一列,为这N个工作的顺序使得罚金最少。工作之间以一空白字元分隔。如果有不只一组答案,请输出字典顺序最小的那组。
各组测试资料间亦请输出一空白列。请参考Sample Outout。
Sample Input | Sample Output |
2 4 3 4 1 1000 2 2 5 5 5 3 4 1 1000 8 8 2 2 5 6 |
2 1 3 4 2 1 5 3 4 |
[H] A min-summer night's dream
现在是西元2200年, 在这200 年间,科学已经向前迈进许多。提到200年,是因为这个问题已经藉由时光机回到西元2000年。在西元2200年时直接把人和电脑处理器连接的科技是办得到的。人们可以在3D 显示器(就是现在的萤幕)上看到他人的梦,就好像在看一部电影。问题是, 这个世纪的人们太依赖电脑了,于是人们分析的能力渐趋于0。现在的电脑可以自动地读进问题,并进一步地解决它。但是电脑只能解决难的问题,目前并没有简单的问题。
我们的科学领导人遇到一个很大的问题,他忘掉了他的密码锁的号码,基于安全性考量,目前的电脑无法解决密码锁的问题。在一个仲夏夜里,科学家做了一个梦,梦里他看到许多数字飞来飞去。他把这些数字纪录在电脑上。接着他想到有一个线索,假如数字列为(X 1 , X 2 , … , X n)他必须找到一个整数A(A就是他密码锁的密码)使得( |X 1 -A| + |X 2 -A| + … … + |X n -A|)为最小。
Input
输入包含多组测试资料。每一组测试资料以一个数字n(0 < n <= 1000000)开始,n 代表在梦中他看到的数字个数。接下来为这n 个数字, 这些数字都大于等于0,小于65536。
Output
对每一组测试资料输出一列。这一列有3个数字。第一个数字为A最小的可能值为多少。第二个数字为输入中有多少个数字和A 有相同的性质(就是能满足上述的条件者)。第三个数字为A可能有多少种可能的不同值(这些不同的数字不必印出来)。这三个数字中间以一个空白来分隔。
Sample Input | Sample Output |
2 10 10 4 1 2 2 4 6 100 2 3 8 1 9000 4 2 2 5 10 |
10 2 1 2 2 1 3 2 6 2 3 4 |
Translated by Tino