さて#163。今回が初本戦参加。
A,Bだけ極端に簡単だったが、両方で1回ずつしょうもないミスをしてひどい順位になった。
ただ、なんとかCを解ききったらまぁまぁな順位でギリギリDiv1昇格になりました。
その後Dも本番時間中に方向性を定めて、その後ノーヒントで解けたしDまで解ききりたかったところ。
では最初の2問から。
http://codeforces.com/contest/266/problem/A
http://codeforces.com/contest/266/problem/B
A. Stones on the Table
最大50文字で、1列に並んだ石の色がRGBで与えられる。
いくつか石を取り除いて隣接する石の色が異なるようにしたい。
取り除くべき石の数の最少の値を答える問題。
これは単純に、同じ色が隣接していたらどちらかを取り除けばよいので、単に隣接する色が同じなら取り除く数をインクリメントするだけ。
int N; void solve() { int f,r,i,j,k,l; char str[100]; int x,y; N=GETi(); GETs(str); j=0; FOR(i,N-1) if(str[i]==str[i+1]) j++; _P("%d\n",j); return; }
B. Queue at the School
最大50文字で、男女の列がBとGで与えられる。また、時間tが与えられる。
時間が1立つと、列中でBとGが隣接し、かつBが手前にいるならBとGが入れ替わる。
時間t経過後の列の状態を答える問題。
文字列から"BG"の並びを見つけて入れ替えるだけ。
注意点として、"BBBBBG"や"BGGGGG"という並びがあっても、各人1回しか入れ替わらないので"BBBBGB""GBGGGG"となり、"GBBBBB"や"GGGGGB"にはならない。
そこで、"BG"を"GB"と入れ替えたら、次は"GB"の次の文字を見るようにした。
int N,T; char str[100]; void solve() { int f,r,i,j,k,l; GET2(&N,&T); GETs(str); FOR(i,T) { FOR(j,N-1) if(str[j]=='B' && str[j+1]=='G'){ swap(str[j],str[j+1]); j++;} } _P("%s\n",str); return; }
まとめ
本番"BBBBBG"の列が1回で"GBBBBB"となるようなコードを書いて失敗した。
簡単な問題こそミスペナルティがでかいので、慎重になりたいね。
これはTopCoderでは出てこない教訓だ。