AtCoder Problems Training Easy(31~40)

#目次

[1~10](https://qiita.com/tnodino/private/fe81289a78c79c53e41e)
[11~20](https://qiita.com/tnodino/private/a2f1118ad8276de714e2)
[21~30](https://qiita.com/tnodino/private/bdce8619699fc9cb3110)
31~40 ← 今ココ
[41~50](https://qiita.com/tnodino/private/3e92afbd7fd8396a8118)
[51~60](https://qiita.com/tnodino/private/62637218c5884b2af10d)
[61~70](https://qiita.com/tnodino/private/0997709fa992e538ed36)
[71~80](https://qiita.com/tnodino/private/1249d60df34c0fda8e6e)
[81~90](https://qiita.com/tnodino/private/83c4a61a0361b8995983)
[91~100](https://qiita.com/tnodino/private/88bacef44c037dc9fc89)

#31. [ABC063 B - Varied](https://atcoder.jp/contests/abc063/tasks/abc063_b)

**Difficulty:102**

元の文字列$\ S\ $の長さを調べておく、これを$\ N\ $とする。
その後、$\ S\ $の重複をなくし、 長さを調べる、 これを$\ M\ $とする。
$\ N=M\ $ならすべての文字が異なっていることが分かる。

```Python
s = list(input())
i = len(s)
s = list(set(s))
j = len(s)
if i != j:
    print('no')
else:
    print('yes')
```

#32. [ABC052 B - Increment Decrement](https://atcoder.jp/contests/abc052/tasks/abc052_b)

**Difficulty:103**

最初、$\ x=0\ $の状態から、$\ N\ $回の操作を実際に行う。
$\ S_i\ $の操作を行うたび、最大値か確認しておく。

```Python
n = int(input())
s = input()
x = 0
ans = 0
for i in range(n):
    if s[i] == 'I':
        x += 1
    else:
        x -= 1
    ans = max(ans,x)
print(ans)
```

#33. [ABC084 B - Postal Code](https://atcoder.jp/contests/abc084/tasks/abc084_b)

**Difficulty:104**

$\ S_1 \dots S_A\ $の範囲に - が存在しない。
$\ S_{A+1}\ $が - である。
$\ S_{A+2} \dots S_{A+B+1}\ $の範囲に - が存在しない。
郵便番号の形式となる 3 つの条件に当てはまるか調べる。

```Python
a,b = map(int,input().split())
s = input()
if '-' in s[:a]:
    print('No')
elif s[a] != '-':
    print('No')
elif '-' in s[a+1:]:
    print('No')
else:
    print('Yes')
```

#34. [ABC087 B - Coins](https://atcoder.jp/contests/abc087/tasks/abc087_b)

**Difficulty:109**

500 円玉 $i$ 枚、 100 円玉 $j$ 枚、 50 円玉 $k$ 枚の合計金額が $X$ になるか順に計算する。

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

#35. [ABC071 B - Not Found](https://atcoder.jp/contests/abc071/tasks/abc071_b)

**Difficulty:111**

文字列$\ S\ $から重複した文字を消しておき、$\ a \dots z\ $のアルファベットが存在するか順に調べる。
存在しない場合はその文字が答えになるが、全て存在した場合は None になる。

```Python
s = list(input())
s = set(s)
m = 'abcdefghijklmnopqrstuvwxyz'
for i in range(len(m)):
    if not m[i] in s:
        print(m[i])
        exit(0)
print('None')
```

#36. [ABC127 C - Prison](https://atcoder.jp/contests/abc127/tasks/abc127_c)

**Difficulty:193**

全てのゲートを 1 枚のカードで通過する場合、$\ \max(L) \le P \le \min(R)\ $のカードを持っていればよい。
$\ \max(L)=4、\min(R)=3\ $の場合、$\ \min(R)\ $を通るために$\ P \le 3\ $にすると$\ \max(L)\ $が通れず、$\ \max(L)\ $を通るために$\ P \ge 4\ $にすると$\ \min(R)\ $が通れず、 1 枚で通れないことが分かる。

```Python
n,m = map(int,input().split())
k = [list(map(int,input().split())) for i in range(m)]
l,r = [list(i) for i in zip(*k)]
x = max(l)
y = min(r)
print(max(y-x+1,0))
```

#37. [ABC141 C - Attack Survival](https://atcoder.jp/contests/abc141/tasks/abc141_c)

**Difficulty:120**

点数が$\ 0\ $以下になると脱落ということは、$\ Q\ $問あるうち$\ K-1\ $問は正解できなくてもよい。
つまり、$\ Q-K+1\ $正解すれば勝ち抜けということになる。
各参加者の正解数を数えて、勝ち抜けか脱落かを判別する。

```Python
n,k,q = map(int,input().split())
a = list(int(input()) for i in range(q))
z = [0] * n
for i in range(q):
    z[a[i]-1] += 1
for i in range(n):
    if z[i] >= q - k + 1:
        print('Yes')
    else:
        print('No')
```

#38. [ABC123 B - Five Dishes](https://atcoder.jp/contests/abc123/tasks/abc123_b)

**Difficulty:118**

全ての料理が届く時刻を最も早くするには、理想は最後の料理が$\ A \mod 10=1\ $で届くことであり、避けたいのは最後の料理が$\ A \mod 10=0\ $で届くことである。
$\ 11,20\ $の料理なら、届く時間は$\ 11,20\ $で 40 、$\ 20,11\ $で 31 とかなりの差が出てしまう。
全ての料理の 1 の位の値を調べておき、 0 以外で一番小さい数字が最後の料理になるよう調整する。
なお、1 の位が全て 0 なら全ての時間を合計するだけでよい。

```Python
a = []
for i in range(5):
    a.append(int(input()))
p = 10
for i in range(5):
    if a[i] % 10 != 0:
        p = min(p,a[i]%10)
ans = 0
for i in range(5):
    if a[i] % 10 != 0:
        if a[i] % 10 == p:
            ans += a[i]
            p = 10
        else:
            ans += a[i] - a[i] % 10 + 10
    else:
        ans += a[i]
print(ans)
```
#39. [ABC134 C - Exception Handling](https://atcoder.jp/contests/abc134/tasks/abc134_c)

**Difficulty:124**

出力する数は 2 つだけに絞れる。
$\ A_i \neq \max(A)\ $の場合、最大値は$\ \max(A)\ $。
$\ A_i= \max(A)\ $の場合、最大値は 2 番目に大きい数。
ソートなどを使って、あらかじめ上二つの値を調べておく。
例えば$\ 1,2,3,4,5,6\ $なら出力は$\ 6,6,6,6,6,5\ $となる。

```Python
n = int(input())
a = list(int(input()) for i in range(n))
b = sorted(list(a))
x = b[-1]
y = b[-2]
for i in range(n):
    if a[i] != x:
        print(x)
    else:
        print(y)
```

#40. [AGC002 A - Range Product](https://atcoder.jp/contests/agc002/tasks/agc002_a)

**Difficulty:64**

$\ a \le 0 \le b\ $なら、 0 を掛けることになるので答えは Zero になる。
$\ 0<a \le b\ $なら、正のみを掛けることになるので答えは Positive になる。
$\ a \le b<0\ $なら、$\ - \times -=+\ $ になることから、$\ 負の個数 \mod 2=0\ $になる場合、答えは Positive になり、そうでないなら Negative になる。

```Python
a,b = map(int,input().split())
if a <= 0 <= b:
    print('Zero')
elif 0 < a <= b:
    print('Positive')
else:
    if (b - a + 1) % 2 == 0:
        print('Positive')
    else:
        print('Negative')
```