AtCoder Beginner Contest 141

はい。
https://atcoder.jp/contests/abc141
ooox-- 939(-20)ダメです。

A - Weather Prediction

PyPy3

ans=["Sunny","Cloudy","Rainy"]
s=input()
print(ans[(ans.index(s)+1)%3])

3つなんとかすればACに。解説ではif3つ書いているようです。

B - Tap Dance

PyPy3

s=input()
ans=1
for a,i in enumerate(s):
    if (a%2 and i=="R") or (a%2==0 and i=="L"):
        ans=0
print(["No","Yes"][ans])

見る必要があるのがLRの出現の仕方だけです。1文字目〜が配列では0番目〜なことに気をつければ大丈夫だと思います。

C - Attack Survival

PyPy3

n,k,q=map(int,input().split())
ans=[0]*n
for i in range(q):
    a=int(input())
    ans[a-1]+=1
for i in ans:
    print(["No","Yes"][i>q-k])

i番目の人が正解するとi番目の人以外のn-1人が1ポイント減るというのを、i番目の人が1ポイント得ると考えることにしました。クエリを全て処理してからq-kより大きいかでYesNo判定しました。

D - Powerful Discount Tickets

PyPy3

import heapq
n,m=map(int,input().split())
q=[]
a=[-int(i) for i in input().split()]
for i in a:
    heapq.heappush(q,i)
ans=chk=0
for i in range(m):
    x=heapq.heappop(q)
    heapq.heappush(q,-(-x//2))
print(-sum(q))

時間中にはAC出来ませんでした。heapqを使って最大値を2で割りながら出し入れする。そのままでが最大値が取り出せないので正負を反転させるのと、負の数のままだと切り捨てで計算がずれるので反転させたり、反転させて戻したりする。

E - Who Says a Pun?

PyPy3

n=int(input())
s=input()
w=[[0]*n for i in range(n)]
ans=chk=0
for i in range(n-1,-1,-1):
    for j in range(n-1,-1,-1):
        if s[i]==s[j]:
            if i==n-1 or j==n-1:
                w[i][j]=1
            else:
                w[i][j]=w[i+1][j+1]+1
for i in range(1,n):
    for j in range(i):
        ans=max(ans,w[i][j]-[0,w[i][j]-(i-j-w[i][j]+1)][j+w[i][j]>=i+1])
print(ans)

時間中には何も出来ませんでした。先頭から見ようとしてどうやって探すか全然方針が立ちませんでした。
解説動画を見ましょう。
後ろから探してDPで更新しながら最長区間を求めるようです。サンプル1であるように連続する文字列の末尾と先頭の部分が重なる場合はその分を減らすようにして最大値を探せば大丈夫だと思います。