schedule2018-01-27

AtCoder 全国統一プログラミング王決定戦予選/NIKKEI Programming Contest 2019の記録 | Python

前回に続いて2回目のコンテスト。 ABC問題くらいはいけるだろうと参戦したらCでダメでした。 情けない。。。

言語はPython3.4です。

コンテスト

全国統一プログラミング王決定戦の予選です。

2019-01-27(日) 21:00 ~ 2019-01-27(日) 23:00

AtCoder 全国統一プログラミング王決定戦予選/NIKKEI Programming Contest 2019

成績

result

順位は2216位。 始まって1時間後から参加したのでしょうがないね。

提出したコードとどう考えたか

解説を見るか同じ言語の回答を見れば良いものですが、備忘録のため提出したコードをどう考えて書いたかのメモしておく。 コメントはあとでつけました。

A - Subscribers

問題

アンケート結果から購読者の重複数の最大と最小を考える問題。 最大はAかBの小さい方。 最小はA+BNA + B − Nか0の大きい方です。

N, A, B = list(map(int, input().split()))

Max = A if A < B else B
Min = (A + B) - N 
Min = max(Min, 0)

print(Max, Min)

なぜ、3項演算子のような書き方をしたのか。 min()でよかった。

解説をみて

Pythonの回答があった。

N, A, B = map(int, input().split())
print(min(A, B), max(0, A + B - N))

すごくスマートです。

B - Touitsu

問題

3つの文字列を一文字ずつ入れ替えて同じになるまでの操作回数を求める問題。

N = int(input().strip())
A = input().strip()
B = input().strip()
C = input().strip()


count = 0
for a, b, c in zip(A, B, C):
  if a is b:
    if a is c:
      continue
    else:
      count += 1
  else:
    if b is c:
      count += 1
    elif a is c:
      count += 1
    else:
      count += 2

print(count)

zip()を使って文字列をいっぺんに扱えたことはよかったが、判定式がグダグダ。

解説をみて

set()で重複しない文字の数を求めればよかったのか。

リファクタリング

N = int(input().strip())
A, B, C = input(), input(), input()

count = 0
for arr in zip(A, B, C):
  count += len(set(arr)) - 1

print(count)

C - Different Strokes

問題

自分の幸福度と相手の幸福度の差が一番大きくなるように交互に選ぶいじわるな問題。 一緒に幸福度を高める道はなかったのか。。。

N = int(input().strip())
arr = []
for n in range(N):
  A, B = list(map(int, input().split()))
  arr.append([ A - B , A, B]) # ここを間違えた。

# 1つめの要素をキーにして降順ソート
arr = sorted(arr, reverse=True)
# それぞれの幸福度
ta = sum([a[1] for a in arr[::2]])
ao = sum([a[2] for a in arr[1::2]])
print(ta - ao)

AとBの差が大きなものから選んでいけば良いかと考えていた。 2次元配列のソートはとても便利だ。 例題と半分のケースは通ってしまうので固執してしまった。

ここで時間終了。

解説をみて

AとBの差ではなく和の降順だったようだ。 色々と試せばよかった。

おわりに

散々な結果になってしまった。 地道に解ける問題を増やすしかない。