AtCoder Beginners SelectionをPython3で解く


## 概要
- ベストな解き方とは言い難いが、とりあえず一通り解いたので載せる
- 「もっとこう解いたほうがいいよ」みたいのがあれば歓迎です
- Python (3.8.2)



## ABC086A - Product

https://atcoder.jp/contests/abs/tasks/abc086_a

- 積が偶数か奇数かを判別する

``` Python
a, b = map(int, input().split())

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

input().split()で読み取った数字はstr型なのでmapを使ってintにcastしている。
list内包表記を使って

``` Python
[a, b] = [int(i) for i in input().split()]
```
と書くこともできる。



## ABC081A - Placing Marbles 

https://atcoder.jp/contests/abs/tasks/abc081_a

- 1,0の文字列から1がいくつあるかを数えればよい

``` Python
#s = str(input())
input_list = list(input())
int_list = [int(s) for s in input_list]
print(sum(int_list))
```

str型にして文字ごとにバラした後にint型を使って足し上げる


## ABC081B - Shift only

https://atcoder.jp/contests/abs/tasks/abc081_b

- listの全要素を2で割っていく
- 割れなくなったら終了

``` Python
N = input()
in_list = [i for i in map(int, input().split())]
max_trial = 1000
for loop in range(max_trial):
  tmp_list1 = [i/2 for i in in_list]
  tmp_list2 = [i%2 for i in in_list]
  sum_res = int(sum(tmp_list2))
  if sum_res > 0:
    print(loop)
    break
  in_list = [i for i in tmp_list1]
```
かなり冗長な書き方になってしまった。
もっとスマートな書き方がぐぐるといっぱい出てきた。
本当はwhile()使ったほうがいいんだろうけど、（バグで）無限ループになるのが怖くてforで書いてある。

## ABC087B - Coins
https://atcoder.jp/contests/abs/tasks/abc087_b

- 500円玉をA枚、100円玉をB枚、50円玉をC枚を使ってX円になるのが何パターンあるか。

``` python
A = int(input())
B = int(input())
C = int(input())
X = int(input())
#print(A, B, C, X)

count=0
for a in range(A + 1):
  for b in range(B + 1):
    for c in range(C + 1):
      if(500*a + 100*b + 50*c == X):
        count += 1
print(count)  
```

これも愚直にfor文3つで解いた。

## ABC083B - Some Sums

https://atcoder.jp/contests/abs/tasks/abc083_b

- 各桁の和が A 以上 B 以下であるものの総和

``` Python
N, A, B = map(int, input().split())
#print(N, A, B)

res=0
for i in range(N+1):
  s = sum([int(x) for x in list(str(i))])
  if (A <= s and s <= B):
    ans += i  
print(ans)
```
1文字ずつ取り出すときにはいったんstrにcastする。

## ABC088B - Card Game for Two

https://atcoder.jp/contests/abs/tasks/abc088_b

- AliceとBobが大きい数字を1枚ずつ取り合うゲームをする

``` Python
N = int(input())
a_list = sorted([int(i) for i in input().split()], reverse=True)
alice = [al for i, al in enumerate(a_list) if i%2==0]
bob   = [bo for i, bo in enumerate(a_list) if i%2==1]
res = sum(alice) - sum(bob)
print(res)
```

実はsortした後はスライスを使うともっとスマートに解ける。

``` Python
print(sum(a[::2]) - sum(a[1::2]))
```

## ABC085B - Kagami Mochi

https://atcoder.jp/contests/abs/tasks/abc085_b

- 結局重複を除いて数字を数え上げればいい

``` Python
N = int(input())
d_set = {input() for i in range(N)}
print(len(d_set))
```

setを使って要素数数えれば一発

## ABC085C - Otoshidama

https://atcoder.jp/contests/abs/tasks/abc085_c

- 10000円札、5000円札、1000円札を使ってY円になる組み合わせを考える

``` Python
[N, Y] = [int(i) for i in input().split()]
#print(N, Y)

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(i, j, k)
      exit(0)
print(-1, -1, -1)
```

脳死で全パターン計算しようとすると、N個のループが3つでO(N^3)
ただ、i+j+k = Nだということを考えればiが決まればjのループはN-iまででよい。
さらにi, jが決まればkは一意に定まる。
exit(0)はbreakとかにすると最後のprint()が表示されるのでここはexit()。


## ABC086C - Traveling

https://atcoder.jp/contests/abs/tasks/arc089_a

- 2次元平面旅行

``` Python
[t_, x_, y_] = [0, 0, 0] 
N = int(input())

for i in range(N):
  t, x, y = map(int, input().split())
  [dt, dx, dy] = [abs(t-t_), abs(x-x_), abs(y-y_)]
  length = dt-dx-dy
  if length < 0 or length%2 == 1:
    print('No')
    exit(0)
  [t_, x_, y_] = [t, x, y] 
print('Yes')
```

その時間でその距離まで到達可能か？とぴったり止まることができるか？を考える。
わかってしまえば簡単。

## まとめ

AtCoderデビューとしてAtCoder Beginners Selectionを解いてみた。
なんとなく雰囲気掴めてきた気がする。