AtCoder Beginner Contest 190 / Python


f:id:penyooo:20200112235130p:plain


  • 独学者です。( 2019 / 9 ~ )
  • AtCoder の問題に Python で取り組んでいます。
  • ABC で4問目(茶か緑)まで解けることを目標にしています。

完全に独学なのでコードは酷いと思います。

AtCoder やってる方、お気軽にコメントください。





結果



f:id:penyooo:20210131002351p:plain

難しくなかった?難しかったよね??だよね!わかるーー。

最近レーティングが下がりまくってたお陰で今回は下がらんかった。

3問目が全然解けなくて危なかったわぁ。





問題と解答と勉強


atcoder.jp



提出したコード
A, B, C = map(int, input().split())
 
if C == 0:
    for _ in range(100):
        if A == 0:
            print("Aoki")
            exit()
        A -= 1
        
        if B == 0:
            print("Takahashi")
            exit()
        B -= 1
 
else:
    for _ in range(100):
        
        if B == 0:
            print("Takahashi")
            exit()
        B -= 1
        
        if A == 0:
            print("Aoki")
            exit()
        A -= 1



何かテンパって場合分けが出来なくてさ。

実際に言われた通りのことしてみるって強引なやつ。

まあでも、そんな訳がないので。

終わってから落ち着いて考えたらすぐ出来た。

後で考えたやつ
A, B, C = map(int, input().split())

if C == 0:
    if A - B >= 1:
        print("Takahashi")
    else:
        print("Aoki")
else:
    if B -A >= 1:
        print("Aoki")
    else:
        print("Takahashi")



んで、これで良いかなと思ってたんだけど。

プロ仕様は違うんね。

プロ仕様
A, B, C = map(int, input().split())

if A > B - C:
    print("Takahashi")
else:
    print("Aoki")



あーね、場合分けこれで良いのかぁ、むむむむ。

ちなみに実際のプロ仕様はこう書いてあった。

A, B, C = map(int, input().split())
print(['Aoki', 'Takahashi'][A > B - C])



ほほう、こんな書き方が・・・。







atcoder.jp



提出したコード
N, S, D = map(int, input().split())
 
for _ in range(N):
    X, Y = map(int, input().split())
    if X < S and Y > D:
        print("Yes")
        exit()
print("No")



これ1問目より簡単だった気がする。

そしてこれはプロ仕様もそんなに変わらんね。







atcoder.jp



これがマジで全っっ然わからんでさ。

TLE になるやつ
import itertools
 
N, M = map(int, input().split())
AB = []
for _ in range(M):
    AB.append(list(map(int, input().split())))
 
K = int(input())
CD = []
for _ in range(K):
    CD.append(list(map(int, input().split())))
    
 
p = itertools.product(*CD)
ans = []
for i in p:
    count = 0
    for j in AB:
        if set(j) <= set(i):
            count += 1
    ans.append(count)
print(max(ans))



2つの皿どちらかに球を置く方法は2通りでしょ、

K 人の人がいるんだから、2の K 乗 通りでしょ。

んで K の最大値が 16 ってことは全通りやってみても行けるでしょ。

てな訳で、球の置き方を全通り出した後に、何点取れるのかを調べるという。

めっちゃ地道に全部やる主義ね。

んで時間が足りないと・・・

そうなんだけどさ。

同じやつで。

通るやつ
import itertools
 
N, M = map(int, input().split())
AB = []
for _ in range(M):
    AB.append(list(map(int, input().split())))
 
K = int(input())
CD = []
for _ in range(K):
    CD.append(list(map(int, input().split())))
    
 
p = itertools.product(*CD)
 
l = 0
ans = []
for i in p:
    if len(set(i)) >= l:
        l = len(set(i))
        count = 0
        for j in AB:
            if set(j) <= set(i):
                count += 1
        ans.append(count)
 
print(max(ans))



球の置き方の時点で明らかに使える数字が少ないやつを弾いたら通った。

でもこれ絶対違うでしょ。

と、思ったのだけど。

正解
import itertools

N , M = map(int,input().split())
AB = [tuple(map(int,input().split())) for _ in range(M)]
K = int(input())
CD = [tuple(map(int,input().split())) for _ in range(K)]
 
ans = 0
for x in itertools.product(*CD):
    x = set(x)
    z = sum(A in x and B in x for A,B in AB)
    if z > ans:
        ans = z
print(ans) 



やり方としては合ってるっぽい。

じゃあ内包表記にすれば最初のやつで通るんじゃないかと思ったけど。

TLE
import itertools
 
N , M = map(int,input().split())
AB = [tuple(map(int,input().split())) for _ in range(M)]
K = int(input())
CD = [tuple(map(int,input().split())) for _ in range(K)]
 
ans = 0
for x in itertools.product(*CD):
    z = sum(set(i) <= set(x) for i in AB)
    if z > ans:
        ans = z
print(ans) 



これは通らないんよね。

通るやつ
import itertools
 
N , M = map(int,input().split())
AB = [tuple(map(int,input().split())) for _ in range(M)]
K = int(input())
CD = [tuple(map(int,input().split())) for _ in range(K)]
 
l = 0 
ans = 0
for x in itertools.product(*CD):
    x = set(x)
    if len(x) >= l:
        l = len(x) 
        z = sum(set(i) <= set(x) for i in AB)
        if z > ans:



で、要らないのを弾くバージョンは通る。

ってことで。

z = sum(set(i) <= set(x) for i in AB)

z = sum(A in x and B in x for A,B in AB)

この部分の差なんだねぇ。

そんなに違わない気がするんだけど、違うもんなんだね。







atcoder.jp



これは時間があれば出来たっぽい。

というか3を飛ばしてこっちにすれば良かった。

まあやってる途中にそんなことわからんけど。







atcoder.jp



atcoder.jp



知らん!!