AtCoder Beginner Contest 109

はい。ooox (0/0) 1009(-18) https://beta.atcoder.jp/contests/abc109

A,B,C3完。Dは方針立ってたけど時間内に書ききれなかった。練習不足ですね。

A - ABC333

Python3

a,b=map(int,input().split())
print("Yes" if (a*b)%2 else "No")

ABで奇数になっていれば、Cは1でも3でもAB*Cは奇数になる。

B - Shiritori

Python3

n=int(input())
d=set()
m=""
for i in range(n):
    s=input()
    if i>0 and (s in d or s[0]!=m[-1]):
        print("No")
        exit()
    m=s
    d.add(s)
        
print("Yes")

1語目はとりあえずsetに入れる。​2語目以降から前の語の末尾としりとりになっているか?と概出ではないか?を見ていって最後まで完走できればYesにした。

C - Skip

Python3

import fractions
a,b=map(int,input().split())
x=list(map(int,input().split()))
x.sort()
s=abs(x[-1]-b)
d=set()
for i in range(a-1):
    s=min(s,abs(x[i]-b))
    d.add(x[i+1]-x[i])
if a==1:
    print(abs(b-x[0]))
    exit()
ans=s
while d:
    ans=fractions.gcd(ans,d.pop())

math.gcd() が3.5以降からだったので無駄に1WAした。gcdくら自前でなんとかするべきだった。むぐぇ。。。
ソートしてそれぞれの座標の隣との距離と、スタート位置と最も近い座標との距離の最大公約数をみた。けどまぁ、言われればそんな気もするんですけどソートとか最も近いとか必要なさそうらしいです。+方向、-方向にDの距離で何回移動するかが変わってもDには影響しないようです。そうですね。

D - Make Them Even

Python3

h,w=map(int,input().split())
l=[]
for i in range(h):
    l.append(list(map(int,input().split())))
ans=[]
for i in range(h):
    for j in range(w):
        i2,j2=i,j
        if i2%2: j2=w-(j+1)
        o,p=i2,j2
        if l[i2][j2]%2:
            if i2%2==0 and j2<w-1: p+=1
            elif i2%2==0 and i2<h-1: o+=1
            elif i2%2 and j2>0: p-=1
            elif i2%2 and i2<h-1: o+=1
            if i2!=o or j2!=p:
                l[i2][j2]-=1
                l[o][p]+=1
                ans.append((i2+1,j2+1,o+1,p+1))
 
print(len(ans))
for i in range(len(ans)):
    print(*ans[i])

方針は立ってたし、合ってたけど時間内にAC出来ませんでした。
偶数枚のマスを最大化するなら、とりあえずは左上から全マスジグザグに移動をしながら奇数枚のマスの時は次の移動先にコインを運ぶ。
入出力1はそんなに親切じゃないけども、入出力2を見るとそんな感じになっているはず。左上の1を続けて移動させて2枚になるマスを作って、左下の1を無駄(というわけでもないのですけど)な移動をさせてるけども、操作が何回でもできることや偶数枚のマスが最大であることに影響しないのでACになる。入出力2がヒントというか答えになってましたねコレ。