Pythonで毎日AtCoder #35

### はじめに
[前回](https://qiita.com/taxfree_python/items/c5b41aeb958d26825c80)
Boot camp for Beginnersやってきます。

### #35
[ABC096-C](https://atcoder.jp/contests/abc096/tasks/abc096_c)

**考えたこと**
孤立している黒のマスを探します。for分で全ての点を調べています。

```python
h, w = map(int,input().split())
s = [input() for _ in range(h)]

for i in range(h):
    for j in range(w):
        if s[i][j] == '#':
            check = 0
            for x, y in ([1,0],[0,1],[0,-1],[-1,0]):
                new_h, new_w = i + x, j + y
                #print(new_h,new_w)
                if new_h < 0 or new_h >= h or new_w < 0 or new_w >= w:
                    continue
                if s[new_h][new_w] == '.':
                    check += 1
            if check == 4: #4方向に黒がない
                print('No')
                quit()
print('Yes')
```

[ABC063-C](https://atcoder.jp/contests/abc063/tasks/arc075_a)

**考えたこと**
最高点は全ての問題に正解したときです。しかし、全ての問題に正解した点数が10の倍数であったときはそのままでは0になってしまいます。ですので、点数の小さい順に最高点から引いていってmod10を確認しています。

```python
n = int(input())
s = [int(input()) for _ in range(n)]

s.sort()
ans = sum(s)
if ans % 10 != 0:
    print(ans)
    quit()
else:
    for i in range(n):
        if (ans-s[i]) % 10 != 0:
            print(ans-s[i])
            quit()

print(0)
```

[ARC073-C](https://atcoder.jp/contests/arc073/tasks/arc073_a)

**考えたこと**
$t_i$のときにシャワーが出ているかどうかによって、処理を分けます。
もしもシャワーが出ているならば、$t_i$時点で残っているシャワーの時間は$t$で上書きされます。
シャワーが出ていないならば、$t_i$から$t+t_i$までシャワーが出ます。

```python
n, t = map(int,input().split())
time = list(map(int,input().split()))

ans = 0
wait = 0
for i in range(n):
    if i == 0:
        ans += t
        wait += t
    if wait <= time[i]:
        ans += t
        wait = time[i] + t
    else:
        c = (wait - time[i])
        ans -= c
        ans += t
        wait = time[i] + t

print(ans)
```

[ABC088-C](https://atcoder.jp/contests/abc088/tasks/abc088_c)

**考えたこと**
(2,1)-(1,1)と(3,1)-(2,1)のように同じ列、行の差は同じになるのでforで実装します。←もっと簡単に解けそう

```python
c = [list(map(int,input().split())) for _ in range(3)]

for i in range(2):
    for j in range(1,3):
        if c[i][j] - c[i][j-1] != c[i+1][j] - c[i+1][j-1]:
            print('No')
            quit()
for i in range(1,3):
    for j in range(2):
        #print(c[i][j] , c[i-1][j])
        #print(c[i][j+1] , c[i-1][j+1])
        if c[i][j] - c[i-1][j] != c[i][j+1] - c[i-1][j+1]:
            print('No')
            quit()
print('Yes')
```

[diverta 2019 Programming Contest-B](https://atcoder.jp/contests/diverta2019/tasks/diverta2019_b)

**考えたこと**
全探索。pythonだとTLEしたのでpypyで出しました。

```python
r, g, b, n = map(int,input().split())

ans = 0
for i in range(n//r+1):
    for j in range(n//g+1):
        bule_ball = (n - (r * i + g * j)) // b
        sum_ball = bule_ball * b + i * r + j * g
        #print(i,j,bule_ball)
        if bule_ball >= 0 and sum_ball == n:
            ans += 1

print(ans)
```

[ABC073-C](https://atcoder.jp/contests/abc073/tasks/abc073_c)

**考えたこと**
数字のチェックリストとかを使って確認すると$A_i$が大きいのでTLEします。ですので、$A$をsortして、隣り合う要素ごとに比較していきます。ここで、$A_i$の出現回数が偶数だと最後まで残らないので出現回数の偶奇を判定します。boolで考えると、出現回数が偶数だと最初Trueだったflagは次の要素との境目時には反転した値になっています。ですので、隣り合う要素が同じでなくなったときのflagの真偽を判定します。

```python
n = int(input())
a = [int(input()) for _ in range(n)]

a.sort()
a.append(0)
ans = 0
flag = True
for i in range(1,n+1):
    if a[i] == a[i-1]:
        flag = not flag
    else:
        if flag:
            ans += 1
        flag = True
    #print(flag)
    #print(a[i])
print(ans)
```

### まとめ
きれいに全探索を書けないときはPyPyで出すべきでした。ではまた、