読者です 読者をやめる 読者になる 読者になる

君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3)

はい。
http://codeforces.com/contest/752

A. Santa Claus and a Place in a Class

ざっくりと大意

・n列m行で2つの作業スペースのある机が並んでいる。
・図のように前の行の左の列から番号が割り振られていた時にk番目は何列何行目の机の左右どちらか?

Python3

n,m,k=[int(i) for i in input().split()]
col=m*2
a=(k-1)//col+1
b=(k-1)%col
print(a,b//2+1,['L','R'][b%2])

何列目かはkと1列あたり何人分かで決まる。何行目かはkと1列あたりとの剰余で決まる。あとは偶奇で左右が決まる。

B. Santa Claus and Keyboard Check

ざっくりと大意

・キーボード掃除後に入れ替わっているキーを特定する。

Python3

s=input()
t=input()
if s==t:
    print(0)
else:
    d={}
    for i in range(len(s)):
        if s[i] not in d and t[i] not in d:
            d[s[i]]=t[i]
            d[t[i]]=s[i]
        elif (s[i] in d and d[s[i]]!=t[i]) or (t[i] in d and d[t[i]]!=s[i]):
            print(-1)
            exit()
    ans=set([])
    for i in d:
        if i!=d[i]:
            if ord(i)<ord(d[i]):
                ans.add((i,d[i]))
            else:
                ans.add((d[i],i))
    print(len(ans))
    for i in ans:
        print(i[0],i[1])

sとtで文字が違ったものは相互?に連想配列に登録する、登録済のものと矛盾があったら即時-1。最後までチェックを完走したら解の出力時には重複を省く必要があるのでset型等に入れてから出力する。

C. Santa Claus and Robot

ざっくりと大意

・各目的地点へ最短の方法で移動しているが目的地点の情報は失われている??
・移動した履歴は残っているのでその情報から目的地が最小で何箇所であったかを出力する??

Python3

n=int(input())
s=input()
x=y=0
ans=1
for i in s:
    if i=='U':
        if y>=0:
            y+=1
        else:
            ans+=1
            y=1
            x=0
    elif i=='D':
        if y<=0:
            y-=1
        else:
            ans+=1
            y=-1
            x=0
    elif i=='R':
        if x>=0:
            x+=1
        else:
            ans+=1
            x=1
            y=0
    elif i=='L':
        if x<=0:
            x-=1
        else:
            ans+=1
            x=-1
            y=0
print(ans)

移動履歴でLとR、UとDのような最短移動でなくなる文字が出たら前回地点が目的地点だったと想定して地点をカウントと移動履歴を取り直す、という感じで大丈夫だと思う。