ABC166 をPythonで解く

atcoder.jp

A~Cを解いた。

A

S = input()
if S=="ABC":
    print("ARC")
else:
    print("ABC")

 

B

N,K = map(int,input().split())
 
O = [0]*N
 
for k in range(K):
    d = int(input())
    A = [int(i) for i in input().split()]
    for a in A:
        O[a-1]+=1
print(O.count(0))

C

展望台の組み合わせは入力と入力を逆にしてlistに格納する。 展望台の組み合わせ一覧に出現した回数と、その展望台が条件を満たす回数が一致しているか否かを数える。

N,M =map(int,input().split())
H= [int(j) for j in input().split()]
AB = []
for _ in range(M):
    a,b = map(int,input().split())
    AB.append([a,b])
    AB.append([b,a])
AB.sort(key=lambda s:s[0])
cnt =0
last_a = AB[0][0]
a_cnt = [0] *N
h_cnt = [0] *N
for a,b in AB:
    a-=1
    b-=1
    a_cnt[a] =a_cnt[a]+1
    if H[a] >H[b]:
        h_cnt[a]=h_cnt[a]+1
    
for i,a in enumerate(a_cnt):
    if h_cnt[i]==a:
        cnt+=1
print(cnt)  

2020年5月振り返り

AtCoder

f:id:yutakasawai:20200605074009p:plain

精進

5月はGWからAtCoderを再開して、110問くらい解いた。

コンテスト

ABC168と169に出場。168でレート上がったけど169で戻った。
レートが590で茶色の真ん中くらいなんですけど、
400点問題が解けるようにならないとレートが上がることを期待できないと感じましたね。
とはいえ現状は300点埋め&アルゴリズムの分野別のお勉強をしているので、心が折れない程度にやっていきますか。

体重

f:id:yutakasawai:20200605074115p:plain 

平日はほとんど自炊をしていて、減少傾向にある。
週末はジャンクなものを食べてしまうので月曜日の朝に体重計に乗るのが憂鬱。。。
とりあえず2日連続で65kg代なのは久しぶり。チノパンがゆるく感じる。
チノパンだとそろそろ暑くて限界なので吸汗速乾素材のパンツを買いたい。

AtCoder過去問精選10問をPythonで解きました。

本当は AtCoder 版!蟻本 (初級編) - Qiita を解こうと思ったのですが、つらかったので先に過去問精選10問をやりました。

AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita

第 1 問: ABC 086 A - Product (100 点)

a, b = map(int, input().split())
if (a*b)%2 ==0:
    print('Even')
else:
    print('Odd')

 

第 2 問: ABC 081 A - Placing Marbles (100 点)

S = list(input())
print(S.count('1'))

第 3 問: ABC 081 B - Shift Only (200 点)

昔の問題(3.4.3)ではgcdはfractionsからimport する。
Python3.8ではmath からimport する。

N = int(input())
A = [int(i) for i in input().split()]
import fractions
from functools import reduce
 
def gcd(*numbers):
    return reduce(fractions.gcd, numbers)
 
def gcd_list(numbers):
    return reduce(fractions.gcd, numbers)
tmp =gcd_list(A)
for i in range(100):
    if tmp == 2**i:
        print(i)
        break

第 4 問: ABC 087 B - Coins (200 点)

A=int(input())
B=int(input())
C=int(input())
X=int(input())
cnt = 0
for a in range(0,A+1):
    for b in range(0,B+1):
        for c in range(0,C+1):
            if a * 500 + b * 100 + c * 50 ==X:
                cnt+=1
print(cnt)

第 5 問: ABC 083 B - Some Sums (200 点)

N,A,B= map(int,input().split())
cnt = 0
for n in range(1,N+1):
    tmp = sum([int(i) for i in str(n)])
    if A<=tmp and tmp <= B:
        cnt+=n
print(cnt)

第 6 問: ABC 088 B - Card Game for Two (200 点)

N = int(input())
A = [int(a) for a in input().split()]
 
A= sorted(A,reverse=True)
Alice = 0
Bob = 0
for i in range(N):
    if i%2==0:
        Alice+=A[i]
    else:
        Bob+=A[i]
print(Alice-Bob)

第 7 問: ABC 085 B - Kagami Mochi (200 点)

N = int(input())
MOCHI=[]
for n in range(N):
    MOCHI.append(int(input()))
print(len(set(MOCHI)))

第 8 問: ABC 085 C - Otoshidama (300 点)

N,Y= map(int,input().split())
for i in range(N+1):
    for j in range(N-i+1):
        k = N-i-j
        if i * 10000 + j *5000 + k *1000 ==Y:
            print(str(i)+" "+str(j)+" "+str(k))
            exit()
print("-1 -1 -1")

第 9 問: ABC 049 C - Daydream (300 点)

S = input()
S2 = S
W_L = ["dream","dreamer","erase","eraser"]
while True:
    cnt = 0
    for w in W_L:
        if S2.endswith(w):
            S2 = S2[:-(len(w))]
            cnt+=1
    if cnt ==0:
        print('NO')
        exit()
            
    if len(S2)<=7:
        break
    
if S2 ==''or S2 in W_L:
    print('YES')
else:
    print('NO')
# C - 白昼夢
S = input()
S2 = S
W_L = ["dream","dreamer","erase","eraser"]
while True:
    cnt = 0
    for w in W_L:
        if S2.endswith(w):
            S2 = S2[:-(len(w))]
            cnt+=1
    if cnt ==0:
        print('NO')
        exit()
            
    if len(S2)<=7:
        break
    
if S2 ==''or S2 in W_L:
    print('YES')
else:
    print('NO')

第 10 問: ABC 086 C - Traveling (300 点)

N = int(input())
T = []
for n in range(N):
    T.append([int(i) for i in input().split()])
now_t = 0
now_x = 0
now_y = 0
cnt=0
for t in T:
    if t[0]%2 !=(t[1]+t[2])%2:
        print('No')
        exit()
        
    if t[0] -now_t  >= abs(t[1]-now_x)+abs(t[2]-now_y):
        now_t = t[0]
        now_x = t[1]
        now_y = t[2]
    else:
        print('No')
        exit()
print('Yes')

分野別 初中級者が解くべき過去問精選 100 問 全探索:全列挙

qiita.com

1~4 全探索:全列挙を解く

分野ごとに解いていきます。

ITP1_7_B - How Many Ways? 

from itertools import combinations

while True:
    n,x =map(int,input().split())
    if n==x and n==0:
        break
    
    L = [i for i in range(1,n+1)]
    cnt = 0
    for i in list(combinations(L,3)):
        if  sum(list(i))==x:
            cnt+=1
    print(cnt)

 

AtCoder Beginner Contest 106 B - 105

N = int(input())
ans = 0
for i in range(1,N+1,2):
    cnt = 0
    for j in range(1,i):
        if i%j==0:
            cnt+=1
    if cnt==7:
        ans+=1
print(ans)

AtCoder Beginner Contest 122 B - ATCoder

S = input()
cnt=0
LEN = len(S)+1
for s in range(LEN):
    for e in range(LEN):
        if len(set(S[s:e])-set(['A','G','C','T']))==0 and len(S[s:e])>cnt:
            cnt = len(S[s:e])
print(cnt)

パ研杯2019 C - カラオケ

N,M = map(int,input().split())
A =[]
for n in range(N):
    A.append([int(i) for i in input().split()])
    
from itertools import combinations
L = [int(i) for i in range(len(A[0]))]
ans = 0
for i in list(combinations(L,2)):
    tmp = 0
    for n in range(N):
        tmp += max(A[n][i[0]],A[n][i[1]])
    if tmp > ans:
        ans=tmp
print(ans)

こうしてみるとitertools で組み合わせを作って解いているパターンが多いな
眠いので今日はここまで。
 

ABC 168 3完でした。

f:id:yutakasawai:20200517231619p:plain最後にAtCoderでたのが19年6月1日M-SOLUTIONS プロコンオープンだったので約1年ぶりにABCに出ました。

ABC168

B問題でprintを入れ忘れてペナルティ。 Dは現状の知識では解けないと判断して撤退し、明日の弁当を作り、この記事を書き始めた。 早解きを鍛えることも必要だが、今日はCまでで12分(+ペナ5分)程度なので、これ以上は縮められたとしても限界がありそう。
やはり緑以上を狙うために400点問題を解けるようにしていかないといけない。

A 提出

ただの場合わけ。

N=int(input())
if int((str(N)[-1])) in [2,4,5,7,9]:
    print('hon')
elif int((str(N)[-1])) in [0,1,6,8]:
    print('pon')
else:
    print('bon')

 

B 提出

ただの場合わけ。最初のifの中にprintを書き忘れたので、ans=hoge にして、 if文を抜けた後にprint(ans)のようにした方がよかったかも。

K = int(input())
S = input()
if len(S)>K:
    print(S[:K]+"...")
else:
    print(S)

C 提出

2辺の長さと角度を求めて、余弦定理から残りの1辺の長さを求める。

A,B,H,M= map(int,input().split())
import numpy as np
h = (60*H)+M
kakudo = abs(0.5*h - 6*h)%360
kakudo = np.radians(kakudo)
C =( A**2+B**2-2*A*B*np.cos(kakudo))**0.5
print(C)

次に何をするか

C問題を解きつつ、以下のQiitaの記事を読み、分野別に過去問を解いていこうと思う。

qiita.com

めも:標準ライブラリは以下の記事などを参考にしながら覚えていく。

Pythonで競技プログラミング -ライブラリ編- - Qiita
競プロで使える!Python標準ライブラリ

これまでの記事はバチャコン日記だったが、本コンテストに出た際はコードも貼っていこうと思う。
今日は初めてMarkdownを使ってみました。
 

屈辱の1完!LINEバチャ#2

LINEバチャ#2に参加して屈辱の1完。

帰宅後低diffから300点埋めをしていて、調子が良かったのだが、これは簡単な問題を解いていることからの勘違いと、今回のように考察が必要な場合にかなりボロボロにやられてしまうことがよく分かった。

f:id:yutakasawai:20200513222558p:plain

https://kenkoooo.com/atcoder/#/contest/show/3033c97d-4df3-41db-8b16-10581a4a769f

 

復習すべき問題

atcoder.jp

 

atcoder.jp

LINEバチャ/緑茶カクテル167風味0511

日曜日に密です3D - 密集団を解散せよをプレイしたところ4面くらいで気持ち悪くなってしまい、寝込んだ。起きたら汗だくだった。時間内にクラスタを壊すゲームなので、高速モードで街中を探索していたら酔ってしまった。ゲームは2Dまでしかできない。

 

LINEバチャ/緑茶カクテル167風味0511

灰と茶までの4完。

 

f:id:yutakasawai:20200512071457p:plain

 

以下2問については問題文を読んだものの解けなかったので復習しようと思う。

少し調べただけでも高橋くんのバグ探しは色々な解法があがっていた。

atcoder.jp

https://upura.hatenablog.com/entry/2019/03/03/230000

https://qiita.com/DaikiSuyama/items/11f63a94d63fa72e8bf4

 

atcoder.jp

https://kakedashi-engineer.appspot.com/2020/04/05/abc161d/