Google Code Jam 1B
基本的に提出したままのコード.解答途中に書いて消しそびれた部分も残ってる.
Problem A - File Fix-it の解答例
mkdirの初期値が-1になっているのは"/"を初期ディレクトリ・リストに入れていなかったせい.あとこのコードだと毎回リストにあるかチェックしているけど,setでチェックされるので初期リスト作成直後と,全追加後の pre_dir.size() の差を取るだけで十分なはず.
#include <iostream> #include <string> #include <set> using namespace std; int solve() { int N, M; cin >> N >> M; set<string> pre_dir; for( int i = 0 ; i < N ; ++i ) { string dir; cin >> dir; pre_dir.insert(dir); } int mkdir = -1; for( int i = 0 ; i < M ; ++i ) { string dir; cin >> dir; dir += "/"; int id = dir.size(); while( (id = dir.find_last_of('/')) != string::npos ) { dir[id] = '\0'; string ndir(dir.c_str()); if( pre_dir.find(ndir) == pre_dir.end() ) { ++mkdir; pre_dir.insert(ndir); } } } return mkdir; } int main(void) { int T; cin >> T; for( int i = 1 ; i <= T ; ++i ) { cerr << "Case #" << i << "\n"; cout << "Case #" << i << ": " << solve() << "\n"; } return 0; }
Problem B - Picking Up Chicks の解答例
#include <iostream> #include <vector> #include <algorithm> using namespace std; int solve() { int N, K, B, T; cin >> N >> K >> B >> T; vector<int> x(N), v(N); for( int i = 0 ; i < N ; ++i ) cin >> x[i]; for( int i = 0 ; i < N ; ++i ) cin >> v[i]; int nSwap = 0, nOK = 0; vector<int>::iterator px, pv, qx, qv; reverse(x.begin(), x.end()); reverse(v.begin(), v.end()); for( int i = 0 ; i < N && nOK < K ; ++i ) { if( x[i] + v[i] * T >= B ) { nSwap += i - nOK; ++nOK; } } if( nOK < K ) return -1; return nSwap; } int main(void) { int C; cin >> C; for( int i = 1 ; i <= C ; ++i ) { cerr << "Case #" << i << "\n"; int r = solve(); if( r >= 0 ) { cout << "Case #" << i << ": " << r << "\n"; } else { cout << "Case #" << i << ": IMPOSSIBLE\n"; } } return 0; }
Problem C - Your Rank is Pure の解答例
largeサイズはRejectされたので修正.1000032≧32bitだったせいでアウトだったので15行目の
ret = (ret + (long long)tmp[k][i] * cmb[n-k-1][k-i-1]) % MOD;
このキャストを入れれば通ったのです.気づいたのは競技終わっての帰り道.残念.
#include <iostream> using namespace std; const int MOD = 100003; int ans[501]; void init(void) { int cmb[501][501]; int tmp[501][501]; cmb[0][0] = 1; for( int n = 1 ; n <= 500 ; ++n ) { cmb[n][0] = cmb[n][n] = 1; for( int k = 1 ; k < n ; ++k ) { cmb[n][k] = (cmb[n-1][k] + cmb[n-1][k-1]) % MOD; } } for( int n = 2 ; n <= 500 ; ++n ) { tmp[n][1] = tmp[n][2] = 1; for( int k = 3 ; k < n ; ++k ) { int ret = 0; for( int i = k - 1 ; i >= 2 * k - n && i >= 1 ; --i ) { ret = (ret + (long long)tmp[k][i] * cmb[n-k-1][k-i-1]) % MOD; } tmp[n][k] = ret; } tmp[n][n] = 0; } for( int i = 2 ; i <= 500 ; ++i ) { int ret = 0; for( int j = 1 ; j < i ; ++j ) { ret = (ret + tmp[i][j]) % MOD; } ans[i] = ret; } } int main(void) { int T; cin >> T; init(); for( int i = 1 ; i <= T ; ++i ) { int n; cin >> n; cerr << "Case #" << i << "\n"; cout << "Case #" << i << ": " << ans[n] << "\n"; } return 0; }