Yandex.Algorithm 2014の最終タスクの分析

8月1日に、最近ベルリンに開蚭されたYandexオフィスが、プログラミングチャンピオンシップの決勝戊を開催したした。 そしお圌の勝者は、スポヌツプログラミングに興味のあるすべおの人、 Gennady Korotkevichに再び知られるようになりたした。



アルゎリズムのタスクは、囜際チヌムによっお準備されたした。 ロシア、ベラルヌシ、ポヌランド、アメリカのプログラマヌが含たれおいたした。 これらはモスクワ州立倧孊のM.V.にちなんで名付けられた専門家です。 ロモノ゜フ、カヌネギヌメロン倧孊、Yandex、Googleの埓業員。 Yandexでは、タスクはミンスクずキ゚フのオフィスの開発者であり、同僚でテストしたした。 昚幎のコンパむラの1人は、圌自身がアルゎリズムのファむナリストでした。 特にHabrahabrに぀いおは、著者に関するすべおの問題を敎理したした。 ずころで、競争が終わったずいう事実にもかかわらず、あなたは仮想コンテストで自分自身を詊すこずができたす。







倚くのファむナリストが勝ったず䞻匵したした。 その䞭には、ACM ICPCずTopCoder Openの勝者ず入賞者、GoogleずFacebookの開発者がいたした。 最終ラりンドでは、2013 Algorithm Evgeny KapunずShi Bisunの勝者、ACM ICPCチャンピオンMikhail Kever 、および䞖界で最もタむトルのあるスポヌツプログラマヌの1人であるPeter Mitrichevが戊いたした 。 今幎、アルゎリズム2013のタスクのコンパむラヌであり、TopCoder Openの管理者でもあるSoejimo Makoto氏も賞を競うこずにしたした。



ゞェナディ・コロトケビッチず東京倧孊の保坂和匘の間で、1䜍争いが燃え䞊がった。 最良の結果-ペナルティ時間の66分で4぀のタスク-コロトケビッチがチャンピオンのタむトルを確認したした。 カズヒロは同じ数の問題を解決したしたが、ペナルティ時間90分以䞊を獲埗し、2䜍になりたした。 3䜍は枅華倧孊の王Q子が勝ちたした。圌は125分のペナルティで4぀の問題を解決したした。



タスクA. 1024 Stack Edition



制限時間 1秒

メモリ制限 512メビバむト



最近、少女クセニアはオンラむンストアでアプリケヌション「1024 Stack Edition」を賌入したした-タヌンベヌスのアヌケヌド。 名前が瀺すように、ゲヌムは2の环乗で満たされたスタックの呚りで行われたす。 ゲヌムのルヌルに埓っお、各タヌンでプレむダヌはスタックで次の3぀のアクションのいずれかを実行できたす。





プレむダヌがスタックに乱数を远加するこずを遞択した堎合、チャンスpで数字1がスタックに远加され、チャンス1- pで数字2が远加されたす。プレむダヌがスタックから最埌の数字を削陀するこずを遞択した堎合、1コむンの眰金を支払いたす。 スタックから最埌のアむテムを削陀する以倖のすべおの操䜜は眰金にならないこずに泚意しおください。 勝぀ためには、プレむダヌはスタックを1぀の芁玠1024だけの状態にする必芁がありたす。さらに、ペナルティヌが少なければ少ないほど良いです。



Ksyushaが電話を無人のたたにするず、垰囜埌、誰かが「1024 Stack Edition」をプレむしおいるこずがわかりたした。 Ksyushaは、自分が誰であり、圌の動機が䜕であるかを知るこずに興味がありたせん。 圌女は、眰金の数孊的予想が䜕であるかを知りたいず考えおおり、ゲヌムをプレむする堎合、圌女は個人的に最適なゲヌムに支払う必芁がありたす。 ご想像のずおり、あなたの仕事はこの数を蚈算するこずです。



タスクAの解析



たず、 N = 0の堎合を考えたす 。 fiを数2 iを収集するために費やさなければならないコむンの予想最小数ずする。 p <100の堎合のfiの蚈算匏を瀺したす。p= 100の堎合、同じ匏が簡単に適甚されたす。



  1. f 0= 1.0 / p-1;
  2. f 1= min  f 0•2; 1 /1- p -1、1-p;
  3. fi = 2• f  i -1、i> 1。


N = 0の堎合、問題の答えはf 10です。

ここで、 N > 0ず仮定したす。gi、jで、スタックの最埌䞊のi芁玠から2 jを1぀だけ取埗するために必芁な予想最小コむン数を瀺したす。 固定iのgi、*の蚈算は2段階で行われたす Siにより、スタックのi番目の最䞊䜍芁玠のバむナリ察数を瀺したす。



1. gi、Si= 1 + mingi-1; *、i> 1を蚈算したす。 このケヌスは、芁玠iの䞊のすべおから特定の番号を取埗し、その埌削陀するずいう事実に察応したす。



gi、Si+ 1= gi-1、Siも蚈算したす。 このケヌスは、 iの䞊にあるすべおの芁玠から番号2 Siを収集し、それを2 Siに等しい珟圚の芁玠ず結合するずいう事実に察応したす。 SiおよびSi+ 1以倖のすべおのjに察しお、 gi、j = + infを眮きたす。



2.最初の段階で、数Siを「圢にした」。 gi + 1、*および数Si + 1に進む前に、スタックのi番目の芁玠でいく぀かのアクションを実行し、他の芁玠に倉換するこずができたす。 これをダむナミクスで考慮するために、次のようにgi、*を再蚈算したす。



• gi、0= mingi、0、mingi、*+ 1.0 / p -すでに芋぀かった倀gi、0を䜿甚するか、任意の数を取るそれを削陀しおそこに1 = 2 0を眮きたす 。

• gi、j= mingi、j、mingi、*+ 1 + fj、gi、j-1+ fj-1 、j> 0 ここで、堎所iにあった番号を削陀しおから、 fjコむンに番号2 jを付けるか、 gi、j-1ステップに番号2 j − 1を付け、 fj-1のステップを収集したす。 2 j − 1をさらに増やし 、それらを組み合わせたす。



問題の答えはgN、10です。 䞭間蚈算では、 g*、11も考慮する必芁があるこずに泚意しおください。 解の耇雑さはONRです 。ここで、 Rは入力に存圚する2の最倧電力ですこの堎合、 R≀10 。







問題B.ラむンタスク



制限時間 4秒

メモリ制限 512メビバむト



怜玢ク゚リ-改善点 質問を入力するフィヌルド、「怜玢」ボタン-およびむンタヌネット党䜓が回答の順序付けられたリストに組み蟌たれおいたす。 毎日䜕癟䞇もの怜玢ク゚リが保存されるため、将来より速く、より良い回答が埗られたすが、これだけでは十分ではありたせん。



ナヌザヌが怜玢ク゚リ自䜓をすばやく入力できるようにするこずが重芁です。 たずえば、ナヌザヌに人気のあるたたは興味深いク゚リオプションを衚瀺し、蚭定に埓っお䞊べ替えるこずができたす。 しかし、誰が質問をしおいるのか分からない堎合はどうなりたすか 2぀の手がかりを蟞曞線集順に提䟛するアルゎリズムを開発するように指瀺されたす。 たあ、ほが蟞曞匏です。



ナヌザヌは、リク゚ストを入力するずきにタむプミスをする可胜性があるこずが知られおいたす。 行Aでラテンアルファベットの任意の小さい文字で1文字しか眮換できず、行Aが行Bより蟞曞線集的に小さくなる堎合、行Aは行Bよりほが小さいず蚀いたす。



N個のヒントワヌドが䞎えられたす。 単語のペアの数をカりントしたす。最初のペアは2番目のペアよりもほずんど少なくなりたす。 順序を考慮しおペアの数を蚈算する必芁がありたす。2぀の単語が盞互にほが小さい堎合は、䞡方のペアを怜蚎したす。



解析問題B



数行のsずwを考えたす。 文字列sは 、1文字を眮換するこずでsから取埗できる蟞曞線集䞊の最小文字列s minが厳密にwより小さい堎合にのみ、文字列wよりほが小さくなりたす。



ただし、芋やすいように、文字列sからs minは 、「a」に等しくない最初の文字を文字「a」で眮き換えるこずによっお取埗されたす。 文字列sが文字 'a'のみで構成される堎合、 s = s min 。 行s iを怜蚎し、 C i - s min i <s jずなる行s j おそらくi = j  の数を芋぀けたす。 次に、 s min i ≠s iの堎合はC i -1を回答に远加し、そうでない堎合はC iを远加する必芁がありたす。



C iの倀を芋぀けるには、2぀の方法を䜿甚できたす。





問題C.キュヌブ



制限時間 2秒

メモリ制限 512メビバむト



面には1〜6のさたざたな敎数で番号が付けられた立方䜓が䞎えられたす。Hexaminoも䞎えられ、そのすべおのセルには1〜6のさたざたな敎数で番号が付けられたす。



ヘキサミノをセルの境界に沿っお曲げるだけで、カットできない堎合は、面の番号が特定のキュヌブの面の番号ず䞀臎するように回転できる、特定のhexaminoからキュヌブを䜜成できるかどうかを刀断したす。



タスクCの解析



このタスクで泚意すべき䞻なこずは、hexaminoをさたざたな方向に曲げるこずができるずいうこずです。 これにより、1組の反察偎の数字の盞互の䞊べ替えだけが互いに異なる2぀のキュヌブが生成されたす180床回転するず2組の反察偎の数字が䞊べ替えられるため、3組すべおの䞊べ替えは1組の䞊べ替えに盞圓したす。



さらに、いく぀かの解決方法がありたす。 それらの1぀は、次の手順で構成されたす。



  1. 察応するhexaminoセルの底面を䜿甚しおキュヌブを蚭定したす。
  2. 軞を䞭心ずするキュヌブの4回転ごずに、キュヌブが回転し、䞋面が察応する番号のセルに圓たるたで、hexaminoに沿っお回転し始めたす。
  3. いく぀かのタヌンで6぀のセルすべおにアクセスする堎合、答えは「はい」です。
  4. そうでない堎合は、右偎ず巊偎の番号を亀換し、手順2からの手順を繰り返したす。
  5. この堎合、どのタヌンでも6぀のセルすべおにアクセスしなかった堎合、答えは「いいえ」です。


11スキャンすべおを蚈算し、hexaminoの䞀臎をチェックしお暙準䜍眮に戻す、䞀臎する堎合は、キュヌブの反察偎に番号を付けるために䜿甚される数字のペアをスキャンの同じペアず䞀臎させるこずもできたす。







タスクD. UFO



制限時間 1秒

メモリ制限 256メビバむト



倜になるず、UFOがVasiny Houseの近くにある湖に萜ちたした。 crash萜時、湖の底郚ず海岞にあったrib骚自䜓ずは察照的に、rib骚間の接合郚は厩壊したした。



朝、ノァシャは湖岞にやっお来お、チタンの棒を芋぀けたした。 これらのロッドがUFOスケルトンの゚ッゞであり、おそらくいく぀かのリブがただ氎䞭にあるず仮定しお、UFOが到着したスペヌスの最小の寞法を決定したす。



問題Dの解決策



これは最も簡単な採甚タスクです。 明らかに、平行六面䜓の寞法は、異なる長さの゚ッゞの数以䞊です。 たた、同じタむプのK次元平行六面䜓の2 K-1゚ッゞ、぀たり、 Xの同䞀の゚ッゞがある堎合、 [X-1/ 2 k − 1 ] + 1枬定を䜿甚するこずに泚意しおください。



したがっお、䞊蚘の匏で蚈算された枬定倀の合蚈数が珟圚の次元以䞋になるたで、昇順ですべおの次元を゜ヌトしたす。 K = 21では、1぀のタむプの゚ッゞが2 20 > 10 6になるため、怜玢は小さくなりたす。



タスクE.䞍完党な䞀臎



制限時間 1秒

メモリ制限 512メビバむト



Artyomkaはマッチングが非垞に奜きです。 無向グラフでのマッチングは、ペアワむズの非隣接゚ッゞのセットで、すでに含たれおいる゚ッゞを削陀せずにもう1぀の゚ッゞをマッチングに远加できない堎合、䞍完党ず呌ばれたす。



無向グラフは、その頂点を2぀のセットに分割しお、グラフの任意の゚ッゞが異なるセットの頂点を接続できる堎合、2郚グラフず呌ばれたす。



Artyomkaには2郚グラフが䞎えられたした。 そのタスクは、1 000 000 00710 9 + 7を法ずする䞍完党マッチングの数を芋぀けるこずです。 あなたの仕事は圌を助けるこずです。



問題Eの解決策



この問題を解決するために、巊ロヌブの頂点の数が少ないこずに泚意しおください。



右ロヌブから1぀の頂点を远加しお、次のダむナミクスを怜蚎したす。fi、j -右ロヌブの最初のi頂点を調べた堎合の゚ッゞを配眮する方法の数。゚ッゞによっお右ロヌブの頂点に接続できたせんでした、1-頂点ぱッゞによっお右ロヌブの頂点に接続できたしたが、この゚ッゞを配眮したせんでした、2-頂点ぱッゞによっお右ロヌブの頂点の1぀に接続されたした



したがっお、右ロヌブの次の頂点を考慮するず、巊ロヌブの頂点のマスクを再蚈算できたす。 明らかに、答えを蚈算するずき、1のないマスクを考慮する必芁がありたす。



したがっお、3進レコヌドに単䜍を含たないすべおのValidMask 3進マスクの堎合、答えは合蚈fn 2 、ValidMaskです。







タスクF.ミュヌゞックワヌルド



制限時間 1秒

メモリ制限 512メビバむト



曎新されたYandex.Musicでは、音楜の掚薊が以前よりもさらに優れおいたす ナヌザヌがサヌビスの䜿甚開始圓初からリッスンする各トラックを考慮し、すでにリッスンしおいるトラックに応じお、掚奚事項のプヌルを増やしたす。 プレヌダヌには、掚奚されるトラックがランダムに含たれおいるため、1日が含たれたす。



しかし、Yandexサヌバヌは非垞に高速であるため、ナヌザヌが珟圚聎いおいるトラックだけでなく、ランダムに遞択された次のトラックのすべおのオプションを掚奚できたす。



ナヌザヌが最初のトラックを遞択するず、アルゎリズムは先のN曲の掚奚を自動的に構築したす。 i番目の䞖代の各曲から、 i + 1番目の䞖代のKi1≀Ki≀5以䞋の新しい曲を取埗できたす。i番目の䞖代では、曲iに基づいお、珟圚の䞖代では、0からKiたでのjごずにj個の新しい曲が予枬されたす。



実隓的研究はむンディヌのゞャンルで行われたため、掚奚されるトラックはすべお異なりたす。 曲の類䌌性に関するさたざたな収集統蚈を枬定するために、トラックの各ペアの類䌌性が枬定されたす。 Yandex開発者がこの枬定のメモリコストを掚定できるように、 N + 1番目の䞖代の掚奚プヌル内のトラックペアの数の数孊的期埅倀を蚈算したす。



問題Fの解決策



Y iは、 i番目の䞖代の歌の数に等しいランダム倉数を瀺したす。 問題に察しお提案された解決策は、生成関数の抂念に基づいおいたす。 慣れおいない堎合は、䟋えばりィキペディアの蚘事ru.wikipedia.org/wiki/Performance_function_of_sequencesで芋぀けるこずができたす。



入力で指定されたランダム倉数の生成関数を考えたす 、そしお

ランダム倉数の関数も生成したす 。



すべおのψiの明瀺的な圢匏ず、φ1 x= xの明瀺的な圢匏がありたす。 φi +1をψiずφi で衚珟するこずを孊びたす。



Y i = kであるこずが確実にわかっおいれば、φi + 1 x=ψix kであるず䞻匵できたす。 しかし、 Y iはランダム倉数であるため、望たしい生成関数は異なる倀に察応する生成関数の合蚈であり、重みはこれらの倀の確率に等しくなりたす。 。



必芁な量の最倧倀は非垞に倧きいため、 Y n + 1の生成関数の明瀺的な圢匏を蚈算するこずはできたせん。 ただし、圌は必芁ありたせん。 蚈算される倀は簡単にわかりたす








前の関数を䜿甚しお、1の関数φi + 1 xの1次および2次導関数である倀を再蚈算する方法を孊習したす。 φi1=ψi1= 1であるこずを思い出したす。ご存知のように、 φi + 1 x=φiψixです。 それから






眮換x = 1を䜿甚するず、これらの匏は単玔化され、次の圢匏を取りたす。









たた、10 9 + 7を法ずしおすぐに蚈算を実行できるこずも理解しやすく、元の確率を察応する法倀で眮き換えたす。



All Articles