Hatena::Grouptopcoder

cafelier@SRM

cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み

スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、

 | 

2009-06-24

SRM443 600

| 14:14 | はてなブックマーク - SRM443 600 - cafelier@SRM

tanakhことhaskell_masterさんの解説を参考に。なるほどなあ。ほとんど普通のBFSのコードのまま綺麗に書ける。かっこいい。全く別のアプローチとしてLayCurseさんの(要ログイン)が更にかっこよすぎる。useがその式になる理由が理解できてないのでちゃんと考えなくては…。

class BinaryFlips { public:
  int minimalMoves(int A, int B, int K) 
  {
    vector<int> visitedUpto(A+B+1, -1);
    visitedUpto[B] = B;

    // Breadth-first search from the initial state (A,B)
    queue< pair<int,int> > q;
    q.push( make_pair(B, 0) );
    while( !q.empty() )
    {
      // pop state (a,b)
      int b=q.front().first, a=A+B-b, step=q.front().second; q.pop();

      // if (a,b) == (0,A+B), done
      if( b == A+B )
        return step;

      // for all possible next values (nb) of b...
      int nb_min = abs(b-K), nb_max = A+B-abs(a-K);
      for(int nb=nb_min; nb<=nb_max; nb+=2)
        if( visitedUpto[nb] == -1 )
        {
          // if not visited, push the new state to the queue
          q.push( make_pair(nb, step+1) );
          visitedUpto[nb] = nb_max;
        }
        else
        {
          // if visited, skip it
          int nb2 = visitedUpto[nb];
          visitedUpto[nb] = max(visitedUpto[nb], nb_max);
          nb = nb2;
        }
    }
    return -1;
  }
};

chenyukunchenyukun2009/06/28 03:36Hi:
I want to learn more about SRM 443, can you give me you email address?

cafeliercafelier2009/07/01 11:45Hi, you can send me a message from my topcoder profile page: http://www.topcoder.com/tc?module=MemberProfile&cr=22758647

トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/cafelier/20090624
 | 

presented by cafelier/k.inaba under CC0