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とかする必要は全く無かったですね。