2016-06-02 4 views
2

からD + Jプログラミングの挑戦:、次のような問題があるKattis

ディックは、D = 12歳です。私たちがこれを言うとき、それはディックが生まれてから少なくとも12年であり、13年ではないことを意味します。

ディックとジェーンには3匹のペットがいます:犬にスポットを当て、パフ・ザ・キャット、イエット・ザ・タートル パフが生まれた時、スポットは歳になった。パフはYertleが生まれたときにp 歳だった。 Yertleが であるとき、スポットはyy歳だった。 Spotの年齢、パフの年齢、およびYertleの年齢の合計は、Dickの年齢(d)とJaneの年齢(j)の合計である になります。 Spot、Puff、 、Yertleは何歳ですか?

入力はs、p、y、jで、必要な出力はスポットの年齢、パフの年齢、および年齢です。

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

+0

スポット= 13.000、パフ= 7.333、yertle = 2.333を満たす入力のS = 5、P = 5、Y = 10の値に依存し、 j = 10である。 SpotとYertleの実際の年齢差はy + [0,1] – hk6279

+0

@ hk6279ですが、PuffとYertleの違いはp + [0,1]と同様です。この場合、スポット= 12.333、パフ= 8、yertle = 2.333、そうでしょうか? 0.6666をスポットに付け加えて、パフやイヤールではないことをどうやって知っていますか? – Giggs

+0

同じルールが(パフとイェールル)と(パフとスポット)に適用されます。しかし、スポット= 12.333、パフ= 8、yertle = 2.333は、12.333-8 = 4.333であるため正しくありません。 – hk6279

答えて

2

浮動小数点演算を使用しないでください。そうパフをインターバル[s, s+1)で生まれたYertleの年齢Y

レッツ・スポットの誕生日の時は、ゼロである

のはD+J = DJ、スポットの年齢S、パフの年齢Pを示すものと、Yertleは間隔[y, y+1)で生まれました。現在の時刻は、[S, S+1)の間隔です。

enter image description here

我々はタイムライン上に見れば、我々は

S = y + Y 
    or 
    S = y + Y + 1 
and 
    S = s + P 
    or 
    S = s + P + 1 

年齢の合計が(0,1,2)が可能補遺

ある

DJ = S + Y + P = S + S - y + S - s - (0, 1, 2) 

であることがわかります

3 * S = DJ + y + s + (0,1,2) 

We右部分 3で割り切れなければならないことを見ることができるので、次calulationsが

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 
+0

包括的な回答をありがとう!あなたは最後のケース、「もっと複雑なケース...」と題したものを詳述してください。 y = s + p + 1のアイデンティティーはどこから来たのですか?最初にYを計算するのに対し、Sを最初に計算することに気付きました。 – Giggs

+0

スポットは2000年1月、パフは2005年10月、Yertleは2011年2月に生まれたと想像してください。s = 5、y = 11、p = 5! 2013年5月にはパフの年齢は7歳(2013-2005 = 8歳)です。答えにいくつかのコメントを追加しました。 – MBo

+0

私はあなたのアルゴリズムを実装しようとしたと働いた!しかし、私のためにこれに答えてください:あなたはSpotの年齢を最初に解決し、それに関してYとPを解決することが重要ですか?私はYertleを最初に解いていて、Yとの関係でSとPを解いていたので、 – Giggs

関連する問題