2012年3月27日火曜日

TopCoder SRM352 Div2 250Pts

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

学生がさぼるので、授業に75%以上出席した者のみ、試験を受けることを許したい。names[]という学生の名前とattendance[]という出席記録を基に、出席率が75%未満の学生の一覧を返すようなメソッドを作成せよ。

namesのi番目とattendanceのi番目が対応する。また、attendanceの内容については、AとPとMという文字が含まれている。Aは欠席、Pは出席、Mは欠席だが課題を出したということに対応している。欠席したが課題を出した場合(つまにMの場合)、その授業は出席率にカウントされない。出席率の要件を満たさない学生の一覧を文字列型配列にして返せ。配列の要素はnamesに現れた順序を守るようにせよ。

私の解答はこちら。

import java.util.ArrayList;

public class AttendanceShort {

 public String[] shortList(String[] names, String[] attendance) {
  ArrayList<String> al = new ArrayList<String>();
  for( int i=0 ; i<names.length ; i++ ){
   int nA = 0;
   int nP = 0;
   for( int j=0 ; j<attendance[i].length() ; j++ ){
    if( attendance[i].charAt(j) == 'A' ){
     nA++;
    }else if( attendance[i].charAt(j) == 'P'){
     nP++;
    }
   }
   if( (double)nP/(nA+nP) < 0.75 ){
    al.add( names[i] );
   }
  }
  return (String[])al.toArray(new String[al.size()]);
 }

}

得点は175.14/250、中央値は約160点。3人撃墜して+150点。PMMMMMMMMMAなど、Mが大量にあるケースが考慮されていない解答を撃墜(実際にはattendanceの科教祖はPとAが1回以上必ず登場する)。rng_58さんの回答は30秒ほど意図が分からず驚きましたが、その意図を理解すると、出席率の判定ロジックに小数点以下を利用しない回答として面白かったです。この問題の0.75については2進数で正確に表現可能なので、実数の不等式で判別しても問題ないとは思いますが、精度を気にする場合のアイディアとして役立てられそうでした。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計