2012年4月12日木曜日

TopCoder SRM374 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。画像があるので、問題の原文も確認していただきたい。それでは、問題文について説明する。

先週、国際アイスホッケー連盟からあるチームのプレーヤーがリンクに入りすぎた場合に警告を出すシステムを要望する至急の電話が入った。システムは次の3つの部分からなる。

  • デジタルカメラが毎秒リンクを撮影する。
  • カメラで撮影された各プレーヤの位置を抽出する
  • ホッケーリンク内にいる同一チームに属する人数を数える。
リンクは真上から見ると、長方形の両端に半円をつけた形状をしている。長方形は幅width、高さheightであり、半円の半径はheight/2で与えられる。また、長方形の左下の座標が(x,y)である。そして、プレーヤの位置がpx[]、py[]という配列で与えられ、プレーヤiの位置は(px[i],py[i])である。

あなたはプロジェクトリーダーから、"リンクの形状とプレーヤーの位置が与えられたときに、リンクの境界とその内部にいるプレーヤーの数を返せ"という、3番目の昨日の実装を割り当てられた。そのようなメソッドを作成せよ。

私の解答はこちら。

public class HockeyFault {

 public int numPlayers(int width, int height, int x, int y, int[] px, int[] py) {
  int nPlayers = 0;
  for( int i=0 ; i<px.length ; i++ ){
   if( px[i] >= x && px[i]<=x+width &&
       py[i]>=y && py[i]<=y+height){
    nPlayers++; // 長方形内部
   }else if( Math.pow(px[i]-x, 2)+Math.pow(py[i]-(y+height/2.0), 2)
             <= Math.pow(height/2.0,2) ){
    nPlayers++; // 長方形の左側の半円内部
   }else if( Math.pow(px[i]-(x+width), 2)+Math.pow(py[i]-(y+height/2.0), 2)
             <= Math.pow(height/2.0,2) ){
    nPlayers++; // 長方形右側の半円内部
   }
  }
  return nPlayers;
 }

}

得点は233.28/250。1回のsubmitでシステムテストクリア。当日の正解率は約87%。素直なので、特にコメントは無い。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計