Home > TopCoder > TopCoder SRM 425

TopCoder SRM 425 このエントリーを含むはてなブックマーク

Rating: 1918 → 1915
レート少し落ちました.前回200あがっているのでまだ良いですが,次はがんばりたいところ.

TopCoder SRM 425, DIV I, 250, CrazyRobot

Overview

東西南北それぞれ移動する確率が与えられる.同じマスを二度踏まない確率を求めよ.

Comment

最初DP的な何かを考えてしまってそれではまり込み時間をロスすることに.結局後回しにしたので残念なことに90点ほどしかとれなかった…orz.解法は純粋に深さ優先の全探索です.

001: struct CrazyBot {
002:     int a[30][30];
003:     double de, dw, ds, dn;
004:     double prob(int k, int x, int y) {
005:         if (a[x][y]) return 0;
006:         if (k == 0) return 1; k--;
007:         a[x][y] = 1;
008:         double p = prob(k, x - 1, y) * dw
009:          + prob(k, x + 1, y) * de
010:          + prob(k, x, y - 1) * dn
011:          + prob(k, x, y + 1) * ds;
012:         a[x][y] = 0;
013:         return p;
014:     }
015:     
016:     double getProbability(int k, int e, int w, int s, int n) {
017:         de = e / 100.0, dw = w / 100.0, 
018:         ds = s / 100.0, dn = n / 100.0;
019:         rep(i, 30) rep(j, 30) a[i][j] = 0;
020:         return prob(k, 14, 14);
021:     }
022: };

TopCoder SRM 425, DIV I, 500, PiecesMover

Overview

5×5の盤面に点が5個以下ある.それを一つ隣に移動するのにコスト1がかかる.全てが隣接するには最低どれだけのコストが必要か.

Comment

ライブラリそのままひっぱってDijkstraで解けばとりあえずどうにかなった.しかし他の人を見る限り普通の幅優先が主流かな?(まぁ当たり前だけど)私のライブラリだと辺書くだけで楽ができるので使っただけです.とりあえず以下のコードを書いて350点ほど貰った.

001: #include "dp_dijkstra.h"
002:
003: struct PiecesMover: public dp_dijkstra<intint> {
004:     void pt(int &n, int x, int y) {
005:         if (n & (1 << (y * 5 + x))) {
006:             n ^= 1 << (y * 5 + x);
007:             if (0 < x) pt(n, x - 1, y);
008:             if (x < 4) pt(n, x + 1, y);
009:             if (0 < y) pt(n, x, y - 1);
010:             if (y < 4) pt(n, x, y + 1);
011:         }
012:     }
013:     
014:     map<intint> edge(int n) {
015:         map<intint> ret;
016:         // 終了ノードからは辺を出さない
017:         if (n == -1) return ret;
018:         // 終了状態の確認
019:         rep(i, 25) if (n & (1 << i)) {
020:             int m = n; pt(m, i % 5, i / 5);
021:             if (m == 0) return ret[-1] = 0, ret;
022:             break;
023:         }
024:         // 次の状態のリストを生成する
025:         rep(i, 25) if (n & (1 << i)) {
026:             int m = n ^ (1 << i);
027:             int x = i % 5, y = i / 5;
028:             if (0 < x) ret[m | (1 << (i - 1))] = 1;
029:             if (x < 4) ret[m | (1 << (i + 1))] = 1;
030:             if (0 < y) ret[m | (1 << (i - 5))] = 1;
031:             if (y < 4) ret[m | (1 << (i + 5))] = 1;
032:             ret.erase(m);
033:         }
034:         return ret;
035:     }
036:     
037:     int getMinimumMoves(vc<str> b) {
038:         int n = 0;
039:         rep(y, 5) rep(x, 5) if (b[y][x] == '*')
040:          n |= 1 << (y * 5 + x);
041:         solve(n);
042:         return d[-1];
043:     }
044: };

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://imoz.jp/2008/11/topcoder-srm-425/trackback/
Listed below are links to weblogs that reference
TopCoder SRM 425 from 超現実いもす(imos)の日記

Home > TopCoder > TopCoder SRM 425

Search
Feeds
Meta

Return to page top