AtCoder Beginner Contest 181 A,B,C,D ( Python )

月曜はレートが温まると気分がいいし、冷えると気分が良くないよね。
そんなわけでまあ感想を書いていこうと思いますーー(泣)

コンテスト概要

atcoder.jp

コンテスト結果

コンテスト結果
あとで詳しく述べますが問題文が理解できていればDは普通に解けた。
悔やまれたコンテストでした...では解説していきます。

A - Heavy Rotation

atcoder.jp

偶奇分けをして終了。
文字を打ち込むと誤字ってWAの可能性があるのでコピペしましょう!

n = int(input())
if n%2 == 0:
    print("White")
else:
    print("Black")

B - Trapezoid Sum

atcoder.jp

解法としては、
(A-1以下の和)-(B以下の和)といった感じでACできます。
ここ最近はΣ計算がよく出ている気がするので復讐が必要ですね!

n = int(input())
ans = 0
for i in range(n):
    a,b = map(int,input().split())
    x = a*(a-1)//2
    y = b*(b+1)//2
    ans += y-x
print(ans)

C - Collinearity

atcoder.jp

ぱっと見衝撃を受ける問題だが、気付きたいのは制約が、
3 ≤ N ≤ 10^2
であるということは3重for文を回せるということ。
なので全探索して、(2点の変化の割合)= (2点の変化の割合)を満たす3点があるかを確認すれば良い。
具体的には調べる3点を (x1, y1), (x2, y2), (x3, y3)とすると
 
\displaystyle
\frac{y2 - y1}{x2 - x1} = \frac{y3 - y2}{x3 - x2}
で求められるが、場合によっては0除算が起こってしまう。
よって分母をかけて払ってしまえばいい!!(気づくまでに40分もかかった。)
したがって、
 
\displaystyle
{(y2 - y1)}{(x3 - x2)} = {(y3 - y2)}{(x2 - x1)}
という結果が成り立つかどうかを全探索すれば良い!!

n = int(input())
x = [0]*n
y = [0]*n
for i in range(n):
    x[i],y[i] = map(int,input().split())
for i in range(n-2):
    for j in range(i+1,n-1):
        for k in range(j+1,n):
            if (y[j]-y[i])*(x[k]-x[j]) == (y[k]-y[j])*(x[j]-x[i]):
                print("Yes")
                exit()
print("No")

D - Hachi

atcoder.jp

冒頭に話した問題文を理解できていなかった問題です。

何を間違えたかというとSの制約が、
 1≤|S|≤2×10^5 となっていたのでこれはSの最大値が200000だと思っていたら、
これ文字列の長さについてなので、最大値は9999999....(9が200000回続くのが上限なんですね。)
何度提出してもREになるので不思議に思ってました。

解法としては8で割り切れる条件は下3桁が000であることです。
よって000, 008, 016, 024, 032, ...といった下3桁の数も8の倍数です。
よって3桁以上の数についてはこれで調べて2桁以下の数については別途確認(文字列として扱って反転させれば楽)すれば良いです。

from collections import Counter
s = input()
cnt = Counter(s)
if len(s) <= 2:
    if int(s)%8 == 0 or int(s[::-1])%8 == 0:
        print("Yes")
        exit()
    else:
        print("No")
        exit()

for i in range(0,1000,8):
    if len(str(i)) <= 2:
        i = str(i)
        i += "0"
        x = Counter(str(i))
    else:
        x = Counter(str(i))
    if len(x-cnt) == 0:
        print("Yes")
        exit()
print("No")

最後に

今週末は2回のコンテストがあったのに絶起と冷えで萎えたのでまた切り替えて頑張っていきたいと思います!!