初心者のプログラミング日記

プログラミング初心者の日記

プログラミングに関することを書いていきます。

ABC141(A~D)

A - Weather Prediction

https://atcoder.jp/contests/abc141/tasks/abc141_a
かかった時間 1分30秒

S=str(input())

if S=="Sunny":
    print("Cloudy")
elif S=="Cloudy":
    print("Rainy")
else:
    print("Sunny")

B - Tap Dance

https://atcoder.jp/contests/abc141/tasks/abc141_b
かかった時間 6分

S=str(input())

for i in range(len(S)):
    if i%2==0:
        if S[i]=="L":
            print("No")
            exit()
    else:
        if S[i]=="R":
            print("No")
            exit()
            
print("Yes")

C - Attack Survival

https://atcoder.jp/contests/abc141/tasks/abc141_c
かかった時間 20分

N,K,Q=map(int,input().split())
List=[K for i in range(N)]

for i in range(Q):
    A=int(input())
    for i in range(N):
        if i+1==A:
            continue
        else:
            List[i]=List[i]-1
            
for i in List:
    if i<=0:
        print("No")
    else:
        print("Yes")

最初に書いたコードはこれだったが、なんかTLEになりそうだったので、下記のコードに書き直した。

N,K,Q=map(int,input().split())
#正解数
num=[0 for i in range(N)]

for i in range(Q):
    A=int(input())
    num[A-1]=num[A-1]+1
    
z=sum(num)
for i in range(N):
    #個人の得点は最初の得点-(全体の正解数-自分の正解数)で求められる
    if K-(z-num[i])<=0:
        print("No")
    else:
        print("Yes")

そもそも、一回ずつ点数を引いていくのは効率が悪いので、正解数のリストを用意して、そこから得点を求める方がはやそうだったのでそうした。
初めて計算量について考えた。

D - Powerful Discount Tickets

https://atcoder.jp/contests/abc141/tasks/abc141_d
かかった時間 15分

N,M=map(int,input().split())
A=list(map(int,input().split()))
New=sorted(A, reverse=True)

while M!=0:
    New[0]=New[0]//2
    M-=1
    New=sorted(New, reverse=True)
    
print(sum(New))

割引券は1番値段が高い商品に使えばいいので、最初にNewというAを降順にしたリストを用意する。
その後、while文で割引券がなくなるまで、New[0]を割引し、NewにNewを降順にソートしたリストを格納する。

heapqというライブラリを使うとはやいらしいです。
https://qiita.com/ell/items/fe52a9eb9499b7060ed6