SRM524
旅路の新幹線の中から更新。たまにはこんな日も良いですよね。
- -
250. MagicDiamonds
問題:与えられた自然数nを、最小何個の合成数の和で表せるか求める
- 合成数なら分解しなくて良いので答えは1
- 素数だったら、1+(n-1) あたりに分解しておけば2個で表せるのでは
- n=2 だったら 1+1
- n>2 だったら (n-1)が偶数になるので2で割り切れる
- しかし冷静に考えたら2は素数なので、3だけは1+1+1で表さないといけない
- Challengeは高速に3を入力するゲームかなぁと、ぼんやり思った
- まで考えたら後は良い気がしたので、適当に組んで提出した。
500. LongestSequence
問題:C[i]>0なら連続するC[i]項の和はすべて正、C[i]<0なら連続する-C[i]項の和はすべて負となるような数列のうち、長さ最大のものの長さを求める。
- hosさんのXmasContestで似た問題を見たような気がする。
- とりあえず、作る数列を{x1, x2, ..., xn}とでもする。
- S(i) = x1 + ... + xi とする
- このとき、隣接するk項の和は、S(i+k)-S(i)で表せる
- これより、Cの各要素について、
- C[i] > 0 : S(j+C[i])-S(j) > 0 より S(j+C[i]) > S(j)
- C[i] < 0 : S(j-C[i])-S(j) < 0 より S(j-C[i]) < S(j)
- が各jについて成り立つ必要がある
- 数列の長さをnとして、S0, S1, ..., Snに対応するn+1個のノードを作る
- S(i) < S(j) が成り立つ必要がある場所について、i->jの枝を張る
- このグラフ上で巡回路があると、 S0 < S2 < ... < S0 のような矛盾が生じる
- なければ各Sの大小関係が定まり、条件を満たす長さnの数列が作れる
- この性質を利用して、数列が作れる最大の長さを求めれば良い
- 長さ1から順に調べても間に合う気はしたけど、チキンなので2分探索した
Challenge Phase
- "3"を高速に入力するゲームには敗北(´・ω・`)
- しかし、何故か"5"で落とせる人がいたので美味しくいただいた
- -
結果:AC / AC / -- ,+50, 577.14pt, 19位
レーティング:2313 -> 2398
Div1で初めて20位以内に入り、レーティングも自己ベストを更新できました。
そろそろ500でDPが出て詰む日も近い気がするので、対策しておかねば…。