AtCoder日記(チュートリアル)

#初めに
とりあえずPythonやるためにクリアしたコードを書いていく予定である。

##ABC086A - Product
積の奇遇を判定。
ビット表現で考えると掛け算は不要で、&して最下位ビットだけ見れば求められる。
Pythonの標準入出力に慣れておらず、そこが一番厄介だった。

```python:atcoder.py
a, b = map(int, input().split())

c = "Even" if (a&b&1)==0 else "Odd"

print(c)
```

##ABC081A - Placing Marbles
ビットカウント。
3ビットしかないので2進で読んでビットを数えればいい。
条件分岐なしで出来る。

```python:atcoder.py
a = int(input(),2)

c = (a&1) + ((a>>1)&1) + ((a>>2)&1)

print(c)
```

##ABC081B - Shift only
総論理和を取ってシフト回数を数える。
リストすべての論理和をmap()か何かできれいにやる方法を思いつかなかった。
右シフト回数カウントは、ビット演算だけで出来るが、総論理和にループがあるので不採用とした。

```python:atcoder.py
n = int(input())
a = list(map(int,input().split()))

bit = a[0]
for b in a[1:]:
    bit = bit | b
result = 0

while (bit!=0) and ((bit&1)==0):
    result+=1
    bit = bit>>1

print(result)
```

##ABC087B - Coins
50^3の総当たり検索。オーダーが小さいのでアルゴリズムはない。
アルゴリズムだと逆に難しい。

```python:atcoder.py
a = int(input())
b = int(input())
c = int(input())
x = int(input())

result = 0

for d in range(a+1):
    for e in range(b+1):
        for f in range(c+1):
            if (d*500+e*100+f*50) == x:
                result += 1

print(result)
```

##ABC083B - Some Sums
総当たりで条件にあてはまるものを加算するだけ。
Pythonの判定処理に問題があるのか//=演算子を入れると強制NGで随分悩んだ。
AtCoderのコードテストだと動作するのに、提出するとサンプル含めてNGだから鯖側に何らかの問題があると思う。
//がコメントになってるとか？
**AtCoderのPythonでは//=は使うべきでない。**

```python:atcoder.py
n,a,b = map(int, input().split())

result = 0

for c in range(1, n+1):
    s = 0
    d = c
    while d>0:
        s += d%10
        #d //= 10 何故かアップロードすると全部NGになる
        d = d//10
    if (s>=a) and (s<=b):
        result +=c

print(result)
```

##ABC088B - Card Game for Two
ソートして奇数番目のsumと偶数番目のsumを取ればよい。
スライスのやり方の勉強。
ただ、pythonだとNが不要であった。

```python:atcoder.py
n = int(input())
a = list(map(int, input().split()))

a.sort(reverse=True)
result = sum(a[::2])-sum(a[1::2])

print(result)
```
##ABC085B - Kagami Mochi
重複排除するだけである。

```python:atcoder.py
n = int(input())
d = []

for a in range(n):
    d.append(int(input()))

result = len(set(d))

print(result)
```
##ABC085C - Otoshidama
力技で当てはまるものを検索。

```python:atcoder.py
N,Y = map(int,input().split())

x = -1
y = -1
z = -1

for i in range(N+1):
    for j in range(N+1-i):
        if(10000*i+5000*j+1000*(N-i-j))==Y:
            x,y,z = i,j,N-i-j
            break

print('{0} {1} {2}'.format(x,y,z))
```
##ABC049C - 白昼夢 / Daydream
逆順スライスで添え字がどうなるかだけが問題だった。
逆順は-1から始まっているから符号反転してマイナス1すればいいらしい。
うっかりdreamerの反転を誤植して、WAした。手動で反転なんてするものじゃなかった。

```python:atcoder.py
S = input()
w = ['maerd','remaerd','esare','resare']
result = 'YES'
 
length = -len(S)
index=0
 
while index>length:
    found = False
    for s in w:
        l = len(s)
        if s==S[index-1:index-l-1:-1]:
            found = True
            index -= l
    if found == False:
        result = 'NO'
        break
 
print(result)
```
##ABC086C - Traveling
移動量と移動時間を求めて、余分な時間が2の倍数か調べればよい。
2回移動すれば元の位置に戻れるので余裕時間は2の倍数でなければならない。

```python:atcoder.py
def canMove(src,dest):
    st,sx,sy = src
    dt,dx,dy = dest
    distance = (abs(dx-sx)+abs(dy-sy))
    tdiff = dt-st
    if tdiff >= distance and ((distance-tdiff)&1) == 0:
        return True
    else:
        return False
        
N = int(input())
txy = []
result = 'Yes'
pos = (0,0,0)

for i in range(N):
    txy.append( tuple(map(int,input().split())) )

for j in txy:
    if canMove(pos,j):
        pos = j
    else:
        result = 'No'
        break

print(result)
```