ABC224 B - Mongeness

atcoder.jp

解答

h,w = map(int,input().split())
a = [[0]*w]*h
flag = False

for i in range(h):
    a[i] = list(map(int,input().split()))
for i in range(h-1):
    for j in range(w-1):
        if (a[i][j]+a[i+1][j+1]) > (a[i+1][j]+a[i][j+1]):
            flag = False
            break
        else:
            flag = True
if flag:
    print('Yes')
else:
    print('No')

最初に提出した解答(WA)

h,w = map(int,input().split())
a = [[0]*w]*h
flag = False

for i in range(h):
    a[i] = list(map(int,input().split()))
for i in range(h-1):
    for j in range(w-1):
        if (a[i][j]+a[i+1][j+1]) <= (a[i+1][j]+a[i][j+1]):
            flag = True
        else:
            flag = False
if flag:
    print('Yes')
else:
    print('No')

WAの理由は、一度でも条件に合わない組み合わせが出たらその時点でNoだということを忘れていたからでした
早くBを瞬殺できるようになりたい

ABC225 B - Star or Not

atcoder.jp

解答

n = int(input())
cnt = [0] * (n+1)
for _ in range(n-1):
    a,b = map(int,input().split())
    cnt[a] += 1
    cnt[b] += 1
for i in range(1,n+1):
    if cnt[i] == (n-1):
        print('Yes')
        exit()
print('No')

ひたすら多重配列に入力値を入れて、その値を数えようとしていた
それだと、(n-1) の頂点に集まっている際にどうしてもうまくいかなかった
なので、入力のあった値をカウント(cnt += 1)していく
(n-1) 回カウントされた値があればYes、なければNo

ABC228 B - Takahashi's Secret

atcoder.jp

解答

n,x = map(int,input().split())
a = list(map(int,input().split()))
set1 = {x}
ind = 0
cnt = 1
for i in range(n):
    if 2 <= cnt:
        if ind != a[ind-1]:
            ind = a[ind-1]
            set1.add(ind)
            cnt += 1
    else:
        if ind != a[x-1]:
            ind = a[x-1]
            set1.add(ind)
            cnt += 1
print(len(set1))
        

一度訪れたところに行かないようにする実装方法が思い浮かばず、
今回もset()にお世話になってしまいました

ABC231 B - Election

atcoder.jp

今回の解答もとてもじゃないけど、スマートなコードではないです
ただ僕と同じく灰色コーダーには理解しやすいのではと思い、載せています

解答

n = int(input())
s = ['']*n
cnt = 0
ans = ''
for i in range(n):
    s[i] = input()
for i in s:
    if cnt < s.count(i): 
        cnt = s.count(i)
        ans = i
print(ans)

countメソッドを使って要素数を数えるところまではすぐに思い浮かんだのですが、
それを要素として出力するのはどうしたらいいかと少し考えました
countメソッドでcnt変数に代入し、毎回比べて大きい場合に中身を変更
その時の要素をまた別の変数に代入して何とか実装してます
ただし、今回の制約として N <= 100 だったためTLEにならずに済んだだけなので、
場合によってはこのコードじゃダメです
なので他の方の解答もみて学ぶのは忘れないで下さい

ABC236 B - Who is missing?

atcoder.jp

計算量の問題で後者のコードだとTLEになってしまい、
ACの解答にたどり着くまで少し苦労しました

ACな解答

n = int(input())
a = list(map(int,input().split()))
gokei = 0
for i in range(1,n+1):
    gokei += (i*4)
print(gokei-sum(a))


TLEな解答

n = int(input())
a = list(map(int,input().split()))
for i in range(1,n+1):
    if a.count(i) != 4:
        print(i)

おそらくfor文の中でcountメソッドを使っているのが原因でしょう
ループの度に毎回数えさせてたら、そりゃ時間かかりますよね

ABC240 B - Count Distinct Integers

atcoder.jp

解法その1

n = int(input())
a = set(input().split())
print(len(a))

Pythonの set は要素の重複を許さないのでそれを使い、要素数を出力


解法その2

n = int(input())
a = list(input().split())
cnt = 1
a.sort()
for i in range(n-1):
    if a[i] != a[i+1]:
        cnt += 1
print(cnt)

sortで昇順にしてから隣同士の要素を比較しイコールじゃない時にカウントを一つ増やす
・カウントの初期値は1にすること、
・for文は回数を -1 して比較の際は +1 にする(IndexError対策)

ITP1_8_C 文字のカウント

onlinejudge.u-aizu.ac.jp

解答

from string import ascii_lowercase, ascii_uppercase
count = [0]*26
while True:
    try:
        sentence = input()
    except: 
        break
    for ch in sentence:
        c = ascii_lowercase.find(ch)
        if -1 < c: count[c] += 1

        c = ascii_uppercase.find(ch)
        if -1 < c: count[c] += 1

for i,j in zip(ascii_lowercase, count):
    print(i + ' : ' + str(j))

zip()関数は複数のイテラブルをfor文で使用したいときに使う
AOJでよくある、~が入力されたら終了という指定が今回はなかったため、
try文でエラーの際に止まるよう記述

ascii_lowercase == abcdefghijklmnopqrstuvwxyz
ascii_uppercase == ABCDEFGHIJKLMNOPQRSTUVWXYZ

配列を作成しようと思ったが、便利なもの見つけたのでモジュール使った