AtCoder Beginner Contest 149 / Python


f:id:penyooo:20191128033629p:plain


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

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

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



今回簡単だったような気がする。

だがしかし!開始時間を間違えて遅刻したので3問しか解けなった。

くそぉ。



結果


採点機能の不具合で今回はレーティング無しになったらしい。

遅刻したときにこうなるとは運が良い。

1問めを解くのにめちゃくちゃ時間が掛かった人になっていたので下がるところだった。


問題と解答と勉強


atcoder.jp

提出したコード
S,T = input().split()
print(T+S)









atcoder.jp

提出したコード
A,B,K = map(int,input().split())
 
a = 0
b = 0
 
if A-K >=0:
    a = A-K
    b = B
elif B - (K-A) >=0:
    b = B - (K-A)
 
print(a,b)










atcoder.jp



提出したコード
import math
 
X = int(input())
ans = 0
 
while ans == 0:
    factor = 0
        
    if X % 2 == 0 and X != 2:
        X +=1
        continue
        
    for divisor in range(2, k//2):
        if X % divisor == 0:
            factor += 1
                
    if factor == 0:
        ans =X
    
    X +=1    
            
print(ans) 



よくある素数判定のコードをwhileで1つ見つけるまで回しただけ。

時間でアウトかと思ったが普通に通った。










atcoder.jp



遅刻してなかったら解けたと思うんだけど。

終わってから考えたコード
N,K = map(int,input().split())
R,S,P = map(int,input().split())
T = list(input())
 
for i in range(N-K):
    if T[K+i] == T[i]:
        T[K+i] = 0

print(sum([T.count("r")*P, T.count("s")*R, T.count("p")*S]))



K回前と手が被って得点にならないところは、K回後に得点できる手を選べば良い。

例えばK回前がグーで、K回後がパーならばチョキを出すことになる。

このような手は必ず1種類以上存在するので何を出すかは考えなくても良い。



4問めで実行時間を気にする必要がなく特殊なアルゴリズムも要らないのは珍しい気がする。









atcoder.jp



いつもの5問めに比べると簡単だと思うが、時間内でここまで解くのは無理だろうなぁ。

全部解いている人は何でそんな速度で解き方が思い浮かぶのだろうか。

借り物のコード
import bisect

def num_shakes(border):
    ret = 0
    for i in range(N):
        if A[i] + A[-1] < border:
            continue
        rest = border - A[i]
        j = bisect.bisect_left(A, rest)
        ret += N - j
    return ret
    

N,M = map(int,input().split())
A = list(map(int,input().split()))

A.sort()
sumA = [0]

for i in range(N):
    sumA.append(sumA[-1] + A[i])
    print(sumA)
 
l,r = A[0]*2, A[-1]*2 + 1 

while r - l > 1:
    p = (l + r)//2
    if num_shakes(p) >= M:
        l = p
    else:
        r = p

m = num_shakes(r)
ans = l * (M-m)

for i in range(N):
    if A[i] + A[-1] < r:
        continue
    rest = r - A[i]
    j = bisect.bisect_left(A, rest)
    ans += A[i] * (N - j) + (sumA[-1] - sumA[j])

print(ans)



あまり難しいことをせずに解いている。









atcoder.jp

やっぱり6問めはよくわからない。