いや、これは解けなくちゃいけない問題でしたね。こういう、それほど難しくない構築は取りたい……。
Div1 Easy EpicPartition
公式解説を読むと、色々方法がある、と書いてある(としか書いてない)。kmjpさんの解説もあるけど、色々な方法があるらしいので、別な方法を考えた。
cの位置を決めることを考える。
kmjpさんの解説にもある通り、cを埋めた残りが全て二個連続していれば(適当な四個を前半二個、後半二個に分けて)"abba"とすることで、aとbの和を一致させることができる。
なので、できるだけ連続している位置にcを埋めたい。
ここで、"c"を埋め込むときの平均値を考える。
たとえば、N=6のとき、全体の和は300、"c"の和は150で8個なので、平均は18.75。なので、18と19を中心に、15~22を"c"にしようとすると2だけ不足する。のえ、最後の22を24に変えれば辻褄が合う。
一般にこういう構成で良いことは立式すれば証明できる(できた)。
1~24xの中から1/3を"c"にするとすると、"c"の和は$144x^2+6x$で、18.5x中心に構成した和は$144x^2+4x$。後者の構成の最大の数は18x+4xなので、それを1~24xの中で最大の数である24xにすれば辻褄が合うことが分かる。
以下、システムテストを通ったコード。
class EpicPartition():
def createPartition(self, N):
if N%4!=0:
return ""
k=N*6
ALL=k*(k+1)//2
CK=(ALL//2)//(k//3)
ANS=["a"]*k
ANS[-1]="c"
for i in range(CK-k//6,CK+k//6-1):
ANS[i]="c"
f=0
for i in range(k):
if f< k//3 and ANS[i]!="c":
if f%2==0:
ANS[i]="a"
else:
ANS[i]="b"
f+=1
elif ANS[i]!="c":
if f%2==1:
ANS[i]="a"
else:
ANS[i]="b"
f+=1
return "".join(ANS)
0 件のコメント:
コメントを投稿