CODE THANKS FESTIVAL 2014 B日程 参加記
CODE THANKS FESTIVAL 2014というリクルート主催のプログラミングコンテストに参加してきました。12月14日に「コワーキング・スペース MONO」で行われました。
概要
- 参加資格
- 予選AまたはBで200点以上獲得
- CODE FESTIVAL本戦不参加
- 交通費
- 交通費全額負担
- 参加にあたっての往復交通費は全額負担いたします。
- 賞品
- 1~10位までは高級焼肉招待
- 5問以上正解で、オリジナルトートバッグプレゼント
- 各問題にFA賞があります
- 親睦会
- 肉、ピザ、寿司祭!
- 各日程ともにコンテスト終了後に懇親会を予定。
移動フェイズ
5時起きで、新幹線に乗って東京(品川)へ。
品川 -> 新橋 -> テレコムセンターに向かう。
ゆりかもめの切符が青い切符だったので、ちょっと珍しかった。
会場が14Fだったのに、エレベーターに14Fのボタンがなくてちょっと焦った。
とりあえず、20Fに行くと、降りるためのエレベーターがあった。
準備フェイズ
領収書を渡して、交通費申請をする
Tシャツと名札をもらって席に着いてWi-Fiの設定をする
しばらくすると、お弁当が配布されだしたので、好きなお弁当を選ぶ。
叙々苑の焼肉弁当を選びました。めちゃおいしかったです。また食べたいと思いました。
11:30くらいから開会式が始まりました。
5問正解するとCODE THANKS FESTIVALのトートバックがもらえると説明されました。トートバックもらうために頑張ろうと決めました。
問題フェイズ
12:00~15:00までの3時間8問出題されました。
オープンコンテストも同時開催されていたので、下のURLから問題が見れます。
Welcome to code thanks festival 2014 B日程(オープンコンテスト) - code thanks festival 2014 B日程(オープンコンテスト) | AtCoder
A問題
2つの値で大きい方を出力するだけ
int main() { int A,B; cin >> A >> B; cout << max( A, B ) << endl; return 0; }
B問題
3つの数字を,足し算と掛け算を使って一番大きくなる数を求める問題
4通りをすべて試して、一番大きな数を取る。
int main() { int A,B,C; cin >> A >> B >> C; int ans = max(A+B+C, (A*B)*C); ans = max(ans, (A+B)*C); ans = max(ans, (A*B)+C); cout << ans << endl; return 0; }
C問題
きつね派とうさぎ派で人気投票を行って、きつね派が過半数を取った地域の数を出力する。全体の数が100の場合に、過半数は50ではないことに注意(51が過半数)。
int main() { int N; cin >> N; vector<int> V(N); vector<int> F(N); rep(nth,N){ cin >> V[nth]; } rep(nth,N){ cin >> F[nth]; } int ans=0; rep(i,N){ if((V[i]/2)-F[i] < 0){ ans++; } } cout << ans << endl; return 0; }
D問題
足ゲームというタコ星人に人気なゲームを行う。T秒間の間、それぞれのボタンをA秒毎に押さなければならない。足ゲームをクリアするために必要な足の数を出力する。
配列に目印を付けて行って、配列内の最も大きな値を出力する。
int main() { int N,T; cin >> N >> T; vector<int> turn(T,0); int A; rep(i,N){ cin >> A; A--; for(int j=A; j<T; j+=(A+1)){ turn[j]++; } } cout << *max_element(ALL(turn)) << endl; return 0; }
E問題
与えられた領域の、示された領域を黒く塗っていく。スタート地点からゴール地点まで、黒いマスだけを通ってクリア出来るか判定する。スタート地点とゴール地点が黒いマスじゃない場合はアウト。
始めに、指定された領域を黒く塗りつぶす。あとは深さ優先探索(dfs)で、ゴール地点に到着出来るか判定する。
const int NONE = 0; const int BLACK = 1; const int VISIT = -1; int dx[4] = {1,0,-1,0}; int dy[4] = {0,1,0,-1}; vector<vector<int>> field; int R,C,N; bool flag; void fill_b(int r, int c, int h ,int w) { REP( y, r, r+h ){ REP( x, c, c+w ){ field[y][x] = BLACK; } } return; } void dfs(int r, int c, int er, int ec) { if( r<0 || r>=R || c<0 || c>=C ){ return; } if(field[r][c] == VISIT){ return; } if(field[r][c] != BLACK){ return; } field[r][c] = VISIT; if( r==er && c==ec ){ flag=true; return; } rep(d,4){ dfs(r+dy[d],c+dx[d],er,ec); } return; } int main() { cin >> R >> C; field.assign(R,vector<int>(C,NONE)); int sr,sc,er,ec; cin >> sr >> sc; cin >> er >> ec; sr--; sc--; er--; ec--; cin >> N; int r,c,h,w; rep(nth,N){ cin >> r >> c >> h >> w; r--; c--; fill_b(r,c,h,w); } flag=false; if(field[sr][sc] != BLACK || field[er][ec] != BLACK){ //Do Nothing... }else{ dfs(sr,sc,er,ec); } cout << ( (flag) ? "YES":"NO" ) << endl; return 0; }
とりあえず、ここまでで1時間ぐらい。トートバックがもらえることが確定。
あと3問あるから1問くらいは解こうと意気込む。
F~H問題
2時間Google先生に相談してみたけど解けず..
ここまで、それなりに手は止まらずコーディング出来ていたものの、F問題から方針が立たず。
G問題の石取りゲームの必勝法みたいのが検索したら出て来た。F問題までは解きたかった。
5完はしていたので、トートバックはもらえた。
後半の体たらくが駄目すぎた。もっと精進しなくては。