ARC#040に参加。
Dが解けなかったけどC早解きでいい順位になってしまった。
http://arc040.contest.atcoder.jp/tasks/arc040_a
http://arc040.contest.atcoder.jp/tasks/arc040_b
A - 床塗り
N*Nのグリッドの一部が赤か青で塗られている。
どちらが多いか答えよ。
愚直に数えるだけ。
int N; string S[1010]; int R,B; void solve() { int i,j,k,l,r,x,y; string s; cin>>N; FOR(i,N) { cin>>S[i]; FORR(r,S[i]) R+=(r=='R'),B+=(r=='B'); } if(R>B) cout<<"TAKAHASHI"<<endl; if(R==B) cout<<"DRAW"<<endl; if(R<B) cout<<"AOKI"<<endl; }
B - 直線塗り
左右に連続したN個のマスがあり、一部が塗られている。
プレイヤーは今一番左端のマスのいる。
1ターンごとに1マス右に移動するか、もしくは今の位置から右側Rマスまでのマスを塗ることができる。
全体を塗るまでに必要な最小ターン数を求めよ。
以下の何れかなら塗る方を選択する。
- 今いるセルが塗られていない
- 今の位置からRマスを塗ると、全体を塗りきることができる。
どちらでもない場合は右のマスに移動する。
int N,R; string S; void solve() { int i,j,k,l,r,x,y; string s; cin>>N>>R>>S; int ret=0; x=0; while(1) { if(count(S.begin(),S.end(),'o')==N) break; ret++; if(S[x]=='.') { hoge: for(i=x;i<=x+R-1 && i<N;i++) S[i]='o'; } else { int num=0; for(i=x+R;i<N;i++) num+=S[i]=='.'; if(num==0) goto hoge; x++; } } cout<<ret<<endl; }
まとめ
ここらへんはだいぶ簡単。
ABC並?