bootcampのeasy100をやった記録 1-10

[AtCoderProblemsのTrainingをPython3でやる Easy編](https://qiita.com/hortensia/items/364f33a7909c169cdd45)
↑これの1-10のやつです。

# 1.[ABC139-B Power Socket](https://atcoder.jp/contests/abc139/tasks/abc139_b)

A個口のタップをx個使った時の未使用の差込口はx*(A-1)+1個なので、それがBを超えるまでxに+1しようと考えました。
whileの条件式とにらめっこしてると、なんで(a-1)/(b-1)を使った良い感じの奴[^1]にしなかったのかという気持ちになりました。

```python
a,b=map(int,input().split())
x=0
while x*(a-1)+1<b:
    x+=1
print(x)

```

# 2.[ABC156-C Rally](https://atcoder.jp/contests/abc156/tasks/abc156_c)

リスト内包表記を使うと短くかけてオシャレですね。
pは0から100の各座標で開いたときの消費する体力の総和を全列挙して、そこから最小値を出せば良いよねと考えました。

```python
n=int(input())
x=[int(i)for i in input().split()]
p=[sum([(j-i)**2 for j in x]) for i in range(101)]
print(min(p))
```

# 3.[CODE FESTIVAL 2016 qua-B Qualification simulator](https://atcoder.jp/contests/code-festival-2016-qualb/tasks/codefestival_2016_qualB_b)

問題文に書いてあることをそのまま愚直に全列挙しました。
解説もそんなものでしたね。

```python
n,a,b=map(int,input().split())
s=input()
passed=0
rank_b=1
for i in range(n):
    if s[i]=="a":
        if passed<a+b:
            print("Yes")
            passed+=1
        else:
            print("No")
    elif s[i]=="b":
        if passed<a+b and rank_b<=b:
            print("Yes")
            rank_b+=1
            passed+=1
        else:
            print("No")
    else:
        print("No")
```

# 4.[三井住友信託銀行プログラミングコンテスト2019-B Tax Rate](https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_b)
最初Nを1.08で割ってどうにかしようとしたのですが、頭がパーになってアーッアアアーッとなったので愚直に調べる方法になりました。
解説を見たら切り上げと切り捨てを使っててなるほどなーとなりました。

```python
n=int(input())
res=0
 
for i in range(1,n+1):
    if int(i*1.08)==n:
        res=i
if res != 0:
    print(res)
else:
    print(":(")
```

# 5.[ABC121-B Can you solve this?](https://atcoder.jp/contests/abc121/tasks/abc121_b)

愚直に全部計算しました。
解説も解法がどうこうというより実装の仕方が主でしたね。

```python
n,m,c=map(int,input().split())
b=[int(i)for i in input().split()]
a=[[int(i)for i in input().split()]for j in range(n)]
res=0
for i in range(n):
    tmp=sum([a[i][j]*b[j]for j in range(m)])+c
    if tmp>0:
        res+=1
print(res)
```

#6.[パナソニックプログラミングコンテスト2020-B Bishop](https://atcoder.jp/contests/panasonic2020/tasks/panasonic2020_b)
左上を(0,0)として各マスを(x,y)とすると、x+yが偶数のマスにしかビショップは移動できないです。
以上を踏まえて愚直に全探索したらTLEしました。

```python
h,w=map(int,input().split())
canMove=sum([[(i+j)%2==0 for i in range(w)]for j in range(h)],[])
print(canMove.count(True))
```

よく見ると入力が$10^9$なんですね。~~なんて性格の悪い~~
そこで、x+yが偶数のマスにしか移動できないことに注目しました。
つまりh*w/2(端数切り上げ)を返せば良いわけですね。
また、hかwが1の場合、初期位置からまったく動かせないことを忘れてはいけません。私はこれでWAを出しました。

なんかこの問題はBっぽくない感じがしました。
全探索するとTLEしたりコーナーケースがあったり……。

```python
from math import ceil
h,w=map(int,input().split())
ans=0
if h==1 or w==1:
    ans=1
else:
    ans=ceil(h*w/2)
print(ans)
```

# 7.[ABC157-B Bingo](https://atcoder.jp/contests/abc157/tasks/abc157_b)
タテ、ヨコ、ナナメのそれぞれで全部出たかを調べれば良いですね。


```python
def bingo():
    for i in a:
        if i[0] in b and i[1] in b and i[2] in b:
            return True
    for i in range(3):
        if a[0][i] in b and a[1][i] in b and a[2][i] in b:
            return True
    tmp=[(a[i][i] in b) for i in range(3)]
    if tmp.count(True)==3:
        return True
    tmp=[a[0][2] in b,a[1][1] in b,a[2][0] in b]
    if tmp.count(True)==3:
        return True
 
a=[[int(i)for i in input().split()]for j in range(3)]
n=int(input())
b=[int(input())for i in range(n)]
bingo=bingo()
print("Yes" if bingo else "No")
```

# 8.[ABC086-B 1 21](https://atcoder.jp/contests/abc086/tasks/abc086_b)
aとbをつなげた数cが平方数ならその平方根dは整数になるので、dの端数を切り捨てた後2乗したものがcと一致するはずですね。
解説を見たら1000までループして全探索してましたが、316までで良いと思いました[^2](どっちにしろ時間内に終わりますが)。

```python
a,b=input().split()
c=int(a+b)
d=int(c**0.5)
print("Yes" if d**2==c else "No")
```

# 9.[ABC074-B Collecting Balls(Easy Version)](https://atcoder.jp/contests/abc074/tasks/abc074_b)
制約から各直線y=i(1<=i<=N)上は
>ロボA---ボール---ロボB

という感じになるので、i番目のボールを回収するコスト$c_i$は$2x_i$か$2(K-x_i)$のうち小さいほうを求めて、それを全部足せば良いと考えました。

```python
n=int(input())
k=int(input())
x=[int(i)for i in input().split()]
cost=sum([min(i,k-i)*2 for i in x])
print(cost)
```

# 10.[ABC088-B Card Game for Two](https://atcoder.jp/contests/abc088/tasks/abc088_b)
最初、アリスとボブの得点を求めてたんですが、よくよく考えたら変数は1つで充分でした。
降順にソートしてi番目(1<=i<=n)のカードのカードの数を、iが奇数なら
足して偶数なら引けば良いんですね。
以下のコードはiが0-indexedだし昇順ソートで後ろから取ってます。

```python
n=int(input())
a=sorted([int(i)for i in input().split()])
res=0
for i in range(n):
    tmp=a.pop(-1)
    if i%2==0:
        res+=tmp
    else:
        res-=tmp
print(res)
```

#おわりに
やっぱり6だけおかしくない？？？？？？？

[^1]: 公式の解説に乗ってるやつのこと
[^2]: 316^2<100100<317^2なので