2012年5月15日火曜日

TopCoder SRM386 Div2 250Pts

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

あなたは棚に一列に並んだトロフィーを所有している。トロフィーの高さはtrophies[]とうい整数型の配列で与えられており、棚の左から右に順番に高さの値が入っている。棚は人が入るときに直接左から見える位置にある。別の言い方をすれば、一番左のトロフィーは完全に見えるし、隣のトロフィーはトロフィーの並ぶ直線の後ろにあるように見える。不幸なことに、背の高いトロフィーが左側にあると他の奥にあるトロフィーが見えるのを遮ってしまう。トロフィーはその手間にあるトロフィーがそれよりも背が低い場合にのみ見えるものとする。そしてあなたは、棚を180度回転させたなら見えるトロフィーが増えるのではないかと考えた。さて、最初の要素が左から見たときに見えるトロフィーの数、2番目の要素は右から見たとき(注:要は180度棚を回転させたときを考えているのでしょう)に見えるトロフィーの数からなる配列を返すメソッドを作成せよ。

私の解答はこちら。

public class TrophyShelf {

 public int[] countVisible(int[] trophies) {
  int min = -1;
  int[] nVisible = new int[2];
  for( int i=0 ; i<trophies.length ; i++ ){ // 左から見た場合
   if( trophies[i] > min ){
    nVisible[0]++;
    min = trophies[i];
   }
  }
  min = -1;
  for( int i=trophies.length-1 ; i>=0 ; i-- ){ // 右から見た場合
   if( trophies[i] > min ){
    nVisible[1]++;
    min = trophies[i];
   }
  }
  return nVisible;
 }

}

得点は245.06/250、1回のsubmitでシステムテストクリア。左右のどちらから見る場合も基本的なロジックは同じで、問題としては簡単とは思います。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計