このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。画像があるので、問題の原文も確認していただきたい。それでは、問題文について説明する。
先週、国際アイスホッケー連盟からあるチームのプレーヤーがリンクに入りすぎた場合に警告を出すシステムを要望する至急の電話が入った。システムは次の3つの部分からなる。
- デジタルカメラが毎秒リンクを撮影する。
- カメラで撮影された各プレーヤの位置を抽出する
- ホッケーリンク内にいる同一チームに属する人数を数える。
あなたはプロジェクトリーダーから、"リンクの形状とプレーヤーの位置が与えられたときに、リンクの境界とその内部にいるプレーヤーの数を返せ"という、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 件のコメント:
コメントを投稿