Subscribed unsubscribe Subscribe Subscribe

stkblog

白血病と関係ないことを書きます なにかあったら教えて下さい

yukicoder #297 カードの数式 やった

本番ではできなかったし、自分でやってることの意味がわからなくなった上に ドキュメント72時間(NHK) が始まったので断念したやつ。

問題

No.297 カードの数式 - yukicoder

0~9, +, - が与えられるので組み合わせて最大/最小の数字を作る。(具体的にはリンク先へどうぞ)

方針

最強の数字(入力が 12345+ なら 5432)を作ってあとはどうにか…

→ 入力に '-' がない場合の最小に対応できてない

解説を見る

http://yukicoder.me/problems/464/editorial

マイナスがないときは「振り分け」ていけばいいらしい。

書いた

#!/usr/bin/python
# -*- coding: utf-8 -*-

N = input()
cn = raw_input().split()

digits = []
plus, minus = 0, 0
for c in cn:
    if c.isdigit():
        digits.append(int(c))
    elif c == '+':
        plus += 1
    elif c == '-':
        minus += 1

digits.sort()
#数字はリストに入れて昇順に並べ、+- は数を数えた

bignumber = digits[plus+minus:]
bignumber.sort(reverse=True)
bignumber = map(str, bignumber)
bignumber = ''.join(bignumber)
bignumber = int(bignumber)
# 最強の数字。取れる数字を大きい方からとって降順に並べ
# str にしてくっつけてからまた int に

smallnumbers = digits[:(plus+minus)]
# のこったやつ(昇順)


# smallest number
if minus == 0:
    smalls = [ [] for loop in xrange(plus+1) ]
    for i in xrange(len(digits)):
        smalls[i%len(smalls)].append(digits[i])
    # 空のリストに数字を順番に振り分けてく
    smalls = map(sorted, smalls)
    SMALL = 0
    for lst in smalls:
        lst = [str(n) for n in lst]
        n = int(''.join(lst))
        SMALL += n
    # 昇順にして str  にしてくっつけて int にして足す

else:
    to_plus = smallnumbers[:1+plus] # 最初の数字は必ず正
    to_minus = smallnumbers[1+plus:]
    if len(to_plus) > 0:
        to_plus = sum(to_plus)
    else:
        to_plus = 0
    if len(to_minus) > 0:
        to_minus = sum(to_minus)
    else:
        to_minus = 0
    SMALL = to_plus - to_minus - bignumber
    # smallnumbers のでかいほうをマイナス、小さい方をプラスすれば最小


# greatest number
to_minus_big = smallnumbers[:minus]
to_plus_big = smallnumbers[minus:]
if len(to_plus_big) > 0:
    to_plus_big = sum(to_plus_big)
else:
    to_plus_big = 0
if len(to_minus_big) > 0:
    to_minus_big = sum(to_minus_big)
else:
    to_minus_big = 0
BIG = bignumber + to_plus_big - to_minus_big
# ここは else 節とほぼ同じ

print BIG, SMALL

これで Accepted なのでとりあえず良かったです
#58054 No.297 カードの数式 - yukicoder


「足すもの」だから to_plus でいいかと思って書いたけど plus って動詞じゃないんじゃejje.weblio.jp


おわり