勝手に解説 TopCoder Marathon Match 82 ColorLinker

Preview:

Citation preview

MM82 ColorLinker勝手に解説

問題概要(1/6)• N*Nのグリッドが与えられる(20 ≦ N ≦ 60)

• 初期状態では、各々のセルは色が塗られているか、塗られていないかのどちらか(色の種類は2~5)

問題概要(2/6)•あなたが行える操作•任意のセルに、任意の色を塗る•ただし1つのセルに複数の色を塗ることも可能

•初期状態で色が塗られていたセルにも色を塗ることが可能

問題概要(3/6)•タスク•同じ色のすべてのセルが、上下左右で連結になるように色を塗る

•ただし、色を塗るとペナルティが加算される(計算方法は後述)

•なるべくペナルティを少なくせよ

問題概要(4/6)

問題概要(5/6)•ペナルティの計算方法•整数p (N ≦ p ≦ 8*N) が与えられる•各々のセルについて、塗られている色の数をcとしたときそのセルのペナルティ = c+c*(c-1)*p

• すべてのセルのペナルティを合計する

問題概要(6/6)•制約•時間制限 10秒(2005年に発売されたXeon 3.6GHz)

• メモリ制限 1024MB•正式な問題文はこちら

問題からわかること

•そのセルのペナルティ = c+c*(c-1)*p• c: 塗られている色の数•N ≦ p ≦ 8*N

問題からわかること

•1色で塗ったとき• c+c*(c-1)*p = 1

問題からわかること•2色で塗ったとき• c+c*(c-1)*p = 2+2*N ~ 2+16*N•複数の色で塗るとペナルティがヤバい•これを避けるためならかなり遠回りしてよい

私の解法•とにかく繋げてみた

•これはマズイ

私の解法•ダイクストラっぽい方法で重ね塗りを避けるようにしてみた

•同じ色のセルに移動 → コスト0•空白のセルに移動 → コスト1•別の色が塗られているセルに移動→ c+c*(c-1)*p

私の解法

✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

私の解法•改善が期待できるところ•つなぐ順番を変えれば交差の回数を減らせる場合があった

•「つなぐ順番を焼きなまし法で決めれば良いんじゃね?」

•少しだけスコアが改善された

私の解法•「高速化して試行回数を増やせばスコア上がるかな?」

•時間を100倍かけて実行してみたが、ほとんどスコア上がらず

•高速化は諦めて別の改善方法を考えたが、思いつかずタイムアップ

他の人の解法

•上位の人たちは、色の種類が高々5種類しかないことも利用しているっぽい?

• TopCoderのForumでネタばらし会が開催中

•日本の人の投稿は #MM82 で検索

Recommended