0.はじめに
解説を見るとA問題からループが必要な問題にしている等
運営方針の変更があったようですね。
1.A - Integer Sum
提供されたリストの合計を算出する問題。
sum関数をつかってすんなり解きました。
https://atcoder.jp/contests/abc272/submissions/35476728
2.B - Everyone is Friends
B問題の割に条件が複雑で、おもわず
C問題に逃げそうになりました。
考え方
1)N人の全組み合わせをキーとした辞書を作る。(値は0)
2)各舞踏会に参加した人の組を調べ
辞書に該当組み合わせがあったら、値を1にする
3)辞書の値を全部参照し、0が一つでもあったら、No
すべて1だったらYesを表示する。
実装
1)N人の全組み合わせをキーとした辞書を作る。(値は0)
d={}
for i in range(1,N):
for j in range(i+1,N+1):
d[i*1000+j]=0
一人目(1~N-1)*1000(Nが100までなので)+2人目(2~N)を
キーに辞書を構成(キーをペアとかにもできた気がしますが私は
ペアを数字に変換する方法がなじんでしまってます。)
2)各舞踏会に参加した人の組を調べ
辞書に該当組み合わせがあったら、値を1にする
L=[]
for i in range(M):
X=list(map(int,input().split()))
L.append(X)
for i in range(M):
r=L[i][0]
#print("2",d,r)
for j in range(1,r):
#print("3",L[i][j])
for k in range(j+1,r+1):
p=L[i][j]*1000+L[i][k]
#print("4",p)
d[p]=1
チェックする際も、一人目*1000+2人目で辞書を検索し
フラグを立てていきました。
列ごとの繰り返しの添え字設定を失敗しててこずりましたが
考え方自体は間違っていませんでした。
3)辞書の値を全部参照し、0が一つでもあったら、No
すべて1だったらYesを表示する。
flg=0
for d_val in d.values():
if(d_val==0):
flg=1
if(flg==1):
print("No")
else:
print("Yes")
答えの求め方はもっとスマートな方法ありそうでしたが
愚直にチェック。
TLEが出なかったので良しとしました。
https://atcoder.jp/contests/abc272/submissions/35490300
3.C - Max Even
問題の意図はすぐわかりましたが実装にてこずりました。
考え方
1)2要素の和=奇数+奇数or偶数+偶数
2)思いついた場合分け
リストを降順に並べ替えて
2-1)1番目と2番目の偶奇が同じ
1番目と2番目を足した値が答え
2-2)1番目と2番目の偶奇が異なる
3番目以降の数で初めに出てきた偶奇それぞれをもとに
偶数最大ペア、奇数最大ペアを求め
比較して大きい方が答え
2-3)リストの最後まで偶奇ペアが出来なかった場合
2-3-1)偶奇どちらかのペアが完成していた場合
どちらか完成しているペアが答え
2-3-1)偶奇どちらかのペアも完成していない場合
-1を表示
考え方自体は難しくないですが、少々無駄に複雑になってしまいました。
解説にあった、偶奇それぞれ違うリストに格納して計算する方法は
わかりやすくスマートだなと思いました。
https://atcoder.jp/contests/abc272/submissions/35496733
4.D以降
Dは一目見てちょっと無理そうとなり
Eに挑戦しましたが、TLEとなる実装方式しか思いつかず
時間切れになりました。