AtCoder Beginner Contest 124

はい。
https://atcoder.jp/contests/abc124

A - Buttons

Python3

x=[int(i) for i in input().split()]
x.sort()
ans=x[-1]
x[-1]-=1
print(ans+max(x))

解説に書かれているような法則がわかっていなかった。なので仕方ないから最大値と1引いた後の最大値を解にするようにした。

B - Great Ocean View

Python3

n=int(input())
h=[int(i) for i in input().split()]
ans=0
chk=h[0]
for i in h:
    if i>=chk:
         ans+=1
         chk=i
print(ans)

左端から最大の高さを更新しながらカウントする。

C - Coloring Colorfully

Python

s=input()
p=[0]*2
for a,i in enumerate(s):
    if a%2==0 and i=="0":
        p[0]+=1
    if a%2==1 and i=="1":
        p[0]+=1
    if a%2==0 and i=="1":
        p[1]+=1
    if a%2==1 and i=="0":
        p[1]+=1
 
print(min(p))

1010...か0101...のような並びのどちらかの形になる。01が一致しない箇所を数えて少ない方が解になる。

D - Handstand

Python3

n,k=map(int,input().split())
s=input()
f=int(s[0])
d=[0]
if f==0: d.append(0)
t=s[0]
for i in s:
    if i==t:
        d[-1]+=1
    else:
        d.append(1)
        t=i
if s[-1]=="0": d.append(0)
ans=chk=0
for i in range(len(d)):
    chk+=d[i]
    if i>=(2*k+1):
        chk-=d[i-(2*k+1)]
    if i%2==0:
        ans=max(ans,chk)
print(ans)

結構悩んだ。色々悩んだ。途中経過はあまり覚えてないです。0が連続して並んでいる箇所をK箇所選んで0を反転させて1にして、1が連続して並んでいる最長を作りたい。
とりあえずは0,1が連続している個数を数える。011000なら、[1,2,3]という風に。でもこれだけだと左端から見た時に奇数番目と偶数番目のどちらが0の個数であるかが変わるので場合分けが必要になり面倒くさい。
なので必ず[1の個数,0の個数,1の個数...]となるように端が1ではない時は個数0ということで0を配列に入れるようにした。011000は[0,1,2,3,0]という風にする。こうすると奇数番目の時だけ最長であるかを確認すればいいようになります。多分。あと見るのは奇数番目ですけどコード上は0始まりなので i%2==0になってます。