Google Code Jam Qualification Round 2011

なんとなくこっち側に書くことに。
gcjは初参加です。

A

  • シミュレーション。
  • 若干面倒になるかと思いましたが、次に動かす色と違う色を最後に動かした時間を記憶して、やってみたら上手く動いたのでサブミットしたら通りました。

こんな感じになりました。

main(){
  int T;
  cin>>T;
  rep(ca,T){
    cout<<"Case #"<<ca+1<<": ";
    int n;
    cin>>n;
    int o=1,b=1;
    int ot=0,bt=0;

    while(n--){
      char r;
      int p;
      cin>>r>>p;
      if(r=='B'){
        bt+=max(abs(p-b)+1,ot-bt+1);
        b=p;
      }else{
        ot+=max(abs(p-o)+1,bt-ot+1);
        o=p;
      }
    }
    cout<<max(bt,ot)<<endl;
  }
}

B

  • 勘違いして4WAした問題。
  • 次の文字が来たときにそれまでにopposeがそろったら、出現済みの文字を全部消すというのをopposeの間にある文字だけを消すのだと勘違いして間違いまくりました。
  • 問題文をよく読んでなんとか提出。

C

  • 読む。smallの場合は全探索すればよさそう。
  • largeもしばらく考えていたら、そういう場合分けが可能なら弟のやり方で全部足したときに0になるようなきがしたので、一番小さいものを弟に、残りを兄にやって事なきを得ました。

D

  • 少し考えただけではsmallの場合すらよく分からない。
  • 紙に書きながら、位置があってないものが3個のときの全てのパターン、4この時の全てのパターンを調べてみると、それぞれ3、4になったので、同じ規則で続くことを信じて提出。
  • 通りました。

何とか全部正解。C,Dあたりはその時の状態で思いついたり分からなかったりする気がするので、自分にとってはかなり調子よかったと思います。