Edited at

AtCoder Beginners Selection 体験記


AtCoder Beginners Selection 体験記

AtCoder Beginner Contest に一度挑戦してみたいなーと思って、練習のために AtCoder Beginners Selection を解いてみた. 言語は、性能が辛ければ Go で、そうでなければ Python 3 にしようと思って提出フォームを見たら、選択肢に Python 2 があって、print にカッコつけるのダルいなと思って Python 2 になった(ダメ人間).


PracticeA - Welcome to AtCoder

8分で完了. どっかの記事で Python で AtCoder するときは入力を input() で受け取るというのを見ていて、使うの初めてながら使ってみたら SyntaxError: unexpected EOF while parsing が出て ??? ってなりながら raw_input() に変えて突破. 問題自体は簡単すぎて特に何も言うことはない.

a = int(raw_input())

b, c = [int(e) for e in raw_input().split()]
s = raw_input()
print "%d %s" % (a + b + c, s)


ABC086A - Product

2分で完了. 簡単すぎて特に何も言うことはない.

a, b = [int(e) for e in raw_input().split()]

if a * b % 2 == 0:
print 'Even'
else:
print 'Odd'


ABC081A - Placing Marbles

4分で完了. 簡単すぎて特に何も言うことはない.

print len([c for c in raw_input() if c == '1'])


ABC081B - Shift only

9分で完了. any の使い方を思い出せば特に難しいことはない.

n = int(raw_input())

a = [int(e) for e in raw_input().split()]
i = 0
while True:
if any(e % 2 == 1 for e in a):
break
i += 1
a = [e / 2 for e in a]
print i


ABC087B - Coins

4分で完了. まあ、総当たりでいいだろうで、終わりではある. 0..n なので range+ 1 するのを忘れなければよいだけ.

a = int(raw_input())

b = int(raw_input())
c = int(raw_input())
x = int(raw_input())
result = 0
for i in range(a + 1):
for j in range(b + 1):
for k in range(c + 1):
if i * 500 + j * 100 + k * 50 == x:
result += 1
print result


ABC083B - Some Sums

6分で完了. 各桁の和は一回文字列に変換して、各桁毎に数値に戻せばいいやで、後は総当りすれば OK. a <= x <= y みたいに書けるのは知ってたけど、初めて書いたかも. 普通の言語では a <= x and x <= y になるのにねー.

n, a, b = [int(e) for e in raw_input().split()]

result = 0
for i in range(1, n + 1):
if a <= sum(int(e) for e in str(i)) <= b:
result += i
print result


ABC088B - Card Game for Two

7分で完了. 最後の行に print を書き忘れて初の WA を食らう(しょぼーん). 要するに大きい方から順に並べて、Alice が偶数個目、Bob が奇数個目を取ると思えば、Python の強みであるスライス処理一発で終わるので、ちょー楽ちん.

n = int(raw_input())

a = [int(e) for e in raw_input().split()]
a.sort()
a.reverse()
print sum(a[::2]) - sum(a[1::2])


ABC085B - Kagami Mochi

3分で完了. 同じ直径のものは積めないってことは、要するに直径の unique を取ればよいわけで、Python は set に突っ込めば一発でそれを取れるので、後は set の要素数を取ってお終い.

n = int(raw_input())

d = [int(raw_input()) for i in range(n)]
print len(set(d))


ABC085C - Otoshidama

7分で完了. 最初 k = n + 1 - i - j になっていて WA. 総当りするだけなので特に難しいことはない.

import sys

n, y = [int(e) for e in raw_input().split()]
for i in range(n + 1):
for j in range(n + 1 - i):
k = n - i - j
if 10000 * i + 5000 * j + 1000 * k == y:
print "%d %d %d" % (i, j, k)
sys.exit()
print "-1 -1 -1"


ABC049C - 白昼夢 / Daydream

1時間くらいで完了. 最初は再帰関数で書いて RE を食らい、あー maximum recursion depth exceeded かーと言いながらループ版に書き直し. これが TLE を食らいマジどーしよとなったけど、s.find(t + w) == 0 って O(n^2) じゃねと思い、O(n)s.startswith(t + w) ならどうだろうと試してみたら通った.

import sys

s = raw_input()
ts = ['']
while True:
nts= []
for t in ts:
for w in ['dreamer', 'eraser', 'dream', 'erase']:
if s == t + w:
print 'YES'
sys.exit()
if s.startswith(t + w):
nts.append(t + w)
if len(nts) == 0:
print 'NO'
sys.exit()
ts = nts


ABC086C - Traveling

40分くらいで完了. 到着した後の残り時間が偶数なら良いんでしょとさらさらっと書き上げて出したら WA. 延々考えてどう考えてもあってるやんけーってなった後に、前の問題と違って Yes / No が大文字小文字混じりであることに気づいた orz. しょうもねえミスすぎた.

import sys

n = int(raw_input())
data = [map(int, raw_input().split()) for i in range(n)]
t = 0
x = 0
y = 0
for d in data:
duration = d[0] - t
distance = abs(x - d[1]) + abs(y - d[2])
if (distance > duration) or ((duration - distance) % 2 == 1):
print 'No'
sys.exit()
t = d[0]
x = d[1]
y = d[2]
print 'Yes'