このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。
タロウとハナコはバニーパズルで遊んでいる。1列にウサギが何匹か並んでいて、各ウサギの位置はbunnies[](昇順にソート済)という整数型配列で与えられている。ウサギは次のように1度だけ振る舞う:aとbの位置にいるウサギAとBを選ぶ。AはBを飛び越え2*b-aの位置に飛ぶ。もしその位置にウサギが既にいれば飛ぶことはできない。複数匹のウサギを飛び越えることもできない。以上の条件が成り立つとき、AとBの選び方の総数を返せ。なおAがBを飛び越えるのと、BがAを飛び越えるのは異なるものとする。
私の解答はこちら。
public class BunnyPuzzle { public int theCount(int[] bunnies) { int n = 0; // 左のウサギがその右の位置にいるウサギを飛び越える for( int i=0 ; i<bunnies.length ; i++ ){ if( i == bunnies.length-2 ){ // 一番右の2匹の組は成立するペア n++; break; } int cur = bunnies[i]; int tar = bunnies[i+1]; int jumpto = bunnies[i] + 2 * (tar - cur); if( jumpto < bunnies[i+2] ) n++; } // 右のウサギがその左の位置にいるウサギを飛び越える for( int i=bunnies.length-1 ; i>=1 ; i-- ){ if( i==1 ){ // 一番左の2匹の組は成立するペア n++; break; } int cur = bunnies[i]; int tar = bunnies[i-1]; int jumpto = bunnies[i] + 2 * (tar - cur); if( jumpto > bunnies[i-2] ) n++; } return n; } }
得点は166.60/250、1回のsubmitでシステムテストクリア。全部の組を探索する必要はなく、隣り合う2匹に着目するのが簡単と気付くまでちょっと時間がかかりました。
0 件のコメント:
コメントを投稿