Codeforces Round #386 (Div.2) 参加記

はい。 oo-o--- (0/0) 1313(+71)
http://codeforces.com/contest/746
初の3完。でもD問題は難易度は実質はB問題相当程度だと思う。A,B問題は結構チェックしたけどHack出来そうなの見当たらず。D問題はLockしなかったので全くの未挑戦。

A. Compote

ざっくりと大意

・料理をするのにa,b,cの材料を1:2:4の比率で使用したときの最大の使用量の総和がいくつか。

Pypy3

 l=[]
for i in range(3):
    n=int(input())
    l.append(n)
ans=min(l[0],l[1]//2,l[2]//4)*7
print(ans)

a,b,cを1:2:4の比率通りに使うのにそれぞれの比率との商の最小値が1:2:4で料理できる最大量になる。それと7との積が使用量の総和で解になる。

B. Decoding

ざっくりと大意

エンコードされた入力の単語のデコードをする?
・サンプル1の解のvolgaは、入力のlogvaの1文字目は解の3文字目のlから取っている。volgaはvogaになる。2文字目のoを取って入力の文字列をloまでデコード。vogaはvgaになる。2文字目のgを取ってlogとvaに。最後にvaを使ってlogvaになる。

Pypy3

n=int(input())
s=input()
ans=''
for a,i in enumerate(s):
    if a==0:
        ans+=i
    elif (a%2==0 and n%2==1) or (a%2==1 and n%2==0):
        ans+=i
    else:
        ans=i+ans
print(ans)

いや、これNoteに騙されたらダメです。入力文字列の1文字目を取り出して、入力文字列の長さが奇数なら1文字目を中心に末尾、先頭を交互に1文字ずつ付け足していく。長さが偶数なら1文字目を中心に先頭、末尾の順で交互に付け足していく。

C. Tram

ざっくりと大意

・なんか移動する。 提出まで至らず。

D. Green and Black Tea

ざっくりと大意

・合計でn回のお茶を飲むために緑茶がa個と黒茶がb個。合わせてn個ある。
・同じ色のお茶を連続で飲むのはk回までにして、n回を飲みきることができるか??

Python2

n,k,a,b=map(int,raw_input().split())
#l=[int(i) for i in input().split()]
ac=a
bc=b
ans=''
if a==b:
    ans='GB'*(n/2)
elif a<b:
    if k>1:
        tmp=(b-a)/(k-1)
        ans='B'*k+'G'
        ans=ans*tmp
        b-=(tmp*k)
        a-=tmp
        ans+='B'*((b-a)%k)+'G'
    ans+='BG'*((n+1)/2)
else:
    if k>1:
        tmp=(a-b)/(k-1)
        ans='G'*k+'B'
        ans=ans*tmp
        a-=(tmp*k)
        b-=tmp
        ans+='G'*((a-b)%k)+'B'
    ans+='GB'*((n+1)/2)
for i in range(n):
    if ans[i]=='B':
        bc-=1
    else:
        ac-=1
print ans[0:n] if ac==bc==0 else 'NO'

もう少し簡潔に書けるはずだと思う。。アプローチとしてはa,bが同じ個数ならGBで交互に飲む。どちらかが多いならばa,bが同数になるまで多い方をkずつ、a,b差分がk未満ならa,b差分だけを使ってa,bが同数になるようにする。a,bが同数になったら、a,bが多かった方に合わせてBGが交互なものを末尾に適当に足した。完成形の文字列を長さn分だけをみて作成した文字列GBの個数とa,bが一致するかで最終チェックして長さnの分だけ出力か、NOを出力かにした。 参加記書いてて気付いたんですが差分がk未満になるまで見てるのに%kとかする必要は全く無かったですね。