2011年12月25日日曜日

TopCoder SRM293 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について、おおまかに説明する。

あなたは水槽を持っている。fishSizes[]という、水槽の中にいる魚のサイズが与えられる。これまではうまくやってきた魚たちだが、あたなはここにBobという新しい魚を加えたいと思っている。魚たちは互いに食べてしまうということがある。魚たちは2倍以上10倍以下のサイズの魚がいるとそれを食べてしまうと見積もっている。このことを考慮して、Bobは次のようなサイズのものがよいと思っている。

  • Bobは食べられる心配がない(他の魚と比べてBobは1/10から1/2のサイズにならない)
  • Bobはほかの魚を食べる心配がない(他の魚がBobの1/10から1/2のサイズにならない)

あなたへの課題は、minSize以上maxSize以下のBobのサイズ(整数値)が与えられたときに、上のような互いに食べあう"衝突"が発生しないBobのサイズの数を返すことである。

私の解答はこちら。

public class Aquarium {

 public int peaceful(int minSize, int maxSize, int[] fishSizes) {
  boolean[] isDangerous = new boolean[maxSize-minSize+1];
  for( int i=minSize ; i<=maxSize ; i++ ){
   int idx = i - minSize;
   for( int j=0 ; j<fishSizes.length ; j++ ){
    if( i >= fishSizes[j]*2 && i<= fishSizes[j]*10 ){
     isDangerous[idx] = true;
     break;
    }
    if( fishSizes[j] >= i*2 && fishSizes[j] <= i*10 ){
     isDangerous[idx] = true;
     break;
    }
   }
  }
  int nPeace = 0; // 上のループで一度にカウントできますね。
  for( int i=0 ; i&l;isDangerous.length ; i++ ){
   if( isDangerous[i] == false) nPeace++;
  }
  return nPeace;
 }

}

得点は226.19/259、中央値は約209点。後半のnPeaceをカウントするfor文は、前半に組み込んで回答することもできる。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計