问题如下:
迪克12岁。当我们这样说的时候,我们的意思是,迪克出生至少已经十二年了,但还没有十三年。
迪克和简有三个宠物:发现狗,吹猫,和耶特尔
乌龟。帕芙出生的时候,斯派特是S岁;帕芙是P
叶特尔出生时年;叶特尔出生时年
出生。Spot的年龄、Puff的年龄和Yertle的年龄之和等于
迪克和简的年龄之和。斑有多大了,小家伙,
那耶特尔呢?
输入是s,p,y,j,输出是spot的年龄,puff的年龄和yertle的年龄。
我的解决方案如下:
import sys
import math
d = 12
for line in sys.stdin:
line = [int(x) for x in line.strip("\n").split()]
s = line[0]
p = line[1]
y = line[2]
j = line[3]
yertle = (d+j-y-p)/3.0
difference = yertle - math.floor(yertle)
if difference > 0.5:
# for the 0.66666 cases
spot = puff = int(math.ceil(yertle+p))
yertle = int(math.floor(yertle))
else:
# for the 0.33333 cases
yertle = int(math.floor(yertle))
puff = yertle + p
spot = d+j - puff - yertle
print spot,puff,yertle
但在某些输入上是不正确的,例如:s=5,p=5,y=10,j=10。因为对于这些规格,狗的实际年龄是:spot=12.333,puff=7.333,yertle=2.333,但是因为我们做整数除法,我们得到12,7,2然而,这些结果并不能满足$$spot+puff+yertle=dick+jane$$
规则。有没有人知道我在哪里犯了错误,或者我应该如何处理/解决这个问题?
P.S.link for problem source
最佳答案
不要使用浮点运算,使用整数。
让我们表示D+J = DJ
,Spot的年龄S
,Puff的年龄P
,Yertle的年龄Y
假设生日时间是零,那么puff出生于interval[s, s+1)
,yertle出生于interval[y, y+1)
。当前时间间隔[S, S+1)
。
如果我们看时间线,我们可以看到
S = y + Y
or
S = y + Y + 1
and
S = s + P
or
S = s + P + 1
年龄总和是
DJ = S + Y + P = S + S - y + S - s - (0, 1, 2)
其中(0,1,2)是可能的附录
3 * S = DJ + y + s + (0,1,2)
我们可以看到右边的部分必须被3整除,所以接下来的计算取决于值
M = (DJ + y + s) modulo 3
case M = 0: (5 5 10 9)
S = (DJ + y + s) / 3 = (21 + 15) / 3 = 12
P = S - s = 12 - 5 = 7
Y = S - y = 12 - 10 = 2
case M = 1: (5 5 10 10)
here we should add 2 to make sum 37 divisible by 3
S = (DJ + y + s + 2) / 3 = (22 + 15 + 2) / 3 = 13
P = S - s - 1 = 13 - 5 = 1 = 7
Y = S - y - 1 = 13 - 10 - 1 = 2
now more complex case M = 2 (5 5 11 10):
here we should add 1 to make sum 38 divisible by 3
and solve - where use 1 - for P or for Y calculation?
We can determine this evaluating s/p/y relation:
if y = s + p + 1 then use 1 for Puff's age else for Yertle
(because Puff's fraction is larger then Yertle's fraction,
she was born in the later year period)
here 11 = 5 + 5 + 1, so
S = (22 + 16 + 1) / 3 = 13
Y = S - y = 13 - 11 = 2
P = S - s - 1 = 13 - 5 - 1 = 7
关于python - Kattis的D + J编程挑战,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37582134/