[翻译]ACMer 2013 Daily Training- 9th Mar for 11x&&12x

本文介绍了一系列有趣的数学游戏和算法挑战,包括构造算术表达式达到目标数、寻找勾股数对、猜数字游戏、确定最大三角形区域、判断树路径总和、优化矩阵乘法顺序、安排工作减少罚款以及通过数字序列推断密码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[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 InputSample 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。

给你一个很有用的公式: ( 1 , 1 ), ( 2 , 2 ), ( 3 , 3 )此3个点所形成的面积为以下式子的绝对值。

0.5 × [( 1 )( 1 ) - ( 1 )( 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 InputSample 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 InputSample 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值