2012年1月12日木曜日

TopCoder SRM309 Div2 250Pts

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

あなたはコンテストのコーディネータであり、コンテスト参加者の最終成績を受け取った。あなたにコンテストの質を決める仕事がやってきた。それを実行するために、あなたは上位k人と下位k人のスコアを取り除いた平均点を計算する。kは0以上の整数とし、平均点を最大にするようなkを選ぶとする。最大となる平均スコアを実数型で返せ。なお、すべてのスコアを取り除くことは許されないものとする。

私の解答はこちら。

import java.util.Arrays;

public class ContestCoordinator {

 public double bestAverage(int[] scores) {
  double max = -1.0;
  Arrays.sort(scores);
  for( int i=0 ; i<scores.length ; i++ ){
   // ソートした後に配列の添字がfromからtoまでの範囲の平均を計算する
   int from = i;
   int to = scores.length-1-i;
   if( from > to ) break;
   max = Math.max(max, ave(scores,from,to));
  }
  return max;
 }
 private double ave(int a[],int from, int to){
  double sum = 0.0;
  for( int i=from ; i<=to ; i++ ){
   sum += a[i];
  }
  return sum/(to-from+1);
 }
}

得点は236.42/250、中央値は約193点。すべての要素を取り除いてはいけないということを表現するところがfrom<toになるのがちょっと考えさせられる点かなと思います。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計