2012年1月13日金曜日

TopCoder SRM310 Div2 250Pts

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

1分間に1度温度を測る装置を持っているが、装置のセンサは100%信頼できるわけではなく、豪快に正しくない値を出してくることがある。新しい装置を買うお金もないので、不適切な値を捨てるソフトウェアを作成して問題に対処することにした。値が-273より小さい、または前後2分かの値と比較して2度よりも大きく変化していたら不適切な値を見なすと考える。measuredValues[]という直近の温度が計測された値が含まれた配列が与えられる。この値は時系列順になっている。つまり、i番目の値は計測を始めてからi分後の温度を示している。妥当な計測値の平均値を計算して返せ。どの計測値も妥当な値でない場合、-300を返すようにせよ。

私の解答はこちら。

import java.util.ArrayList;
import java.util.Iterator;

public class MeasuringTemperature {

 public double averageTemperature(int[] measuredValues) {
  ArrayList<Integer> set = new ArrayList<Integer>();
  for( int i=0 ; i<measuredValues.length ; i++ ){
   if( measuredValues[i] < -273 ){
    continue;
   }
   int from = i-2 <= 0 ? 0 : i-2;
   int to = i+2 <= measuredValues.length-1 ? i+2 : measuredValues.length-1;
   for( int j=from ; j<=to ; j++ ){
    if( j == i ){
     continue;
    }
    if( Math.abs(measuredValues[i]-measuredValues[j])<=2 ){
     set.add(measuredValues[i]);
     break;
    }
   }
  }
  if( set.size() == 0 ) return -300.0;
  Iterator<Integer> it = set.iterator();
  double sum = 0.0;
  while (it.hasNext()) {
   sum += it.next();
  }
  return sum/set.size();
 }

}

得点は160.57/250、中央値は約129点。点数が低いのは英語の読解問題だったからです。やっかいだったのは、先頭は後ろ2つの測定を見るだけでOKというようなことが明示されていなかったことだったりします。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計