ABC224 B - Mongeness
解答
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
解答
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
解答
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
今回の解答もとてもじゃないけど、スマートなコードではないです
ただ僕と同じく灰色コーダーには理解しやすいのではと思い、載せています
解答
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?
計算量の問題で後者のコードだと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
解法その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 文字のカウント
解答
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
配列を作成しようと思ったが、便利なもの見つけたのでモジュール使った