このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
Byterlandの牛は騒々しく鳴き、住民に迷惑をかけている。PemberleyのDarcyさんはこの問題を牛1匹だけが鳴くことを許すことによって解決しようと計画している。他の牛にもっとも攻撃的でない牛を1匹選ぶ。Pemberleyの農場はn*mの長方形の草原に分けられる。各区画は何もないか、牛がいるという状態のどちらかである。(x,y)の位置にいる牛が鳴いたとき、(i,j)の位置にいる牛の不満はユークリッド距離の2乗であらわされる。不満の総計はすべての牛の不満の合計で表される。1匹の牛が鳴くことのみを許したとき、牛の不満が最小となるときのその値を返せ。農場はfarmlang[]という文字列型の配列で表され、"."は空の区画、"C"が牛のいる区画を表すものとする。
私の解答はこちら。
import java.util.ArrayList;
public class MooingCows {
public int dissatisfaction(String[] farmland) {
ArrayList<Integer> xPos = new ArrayList<Integer>();
ArrayList<Integer> yPos = new ArrayList<Integer>();
// 前半で牛のいる位置を全部求める。
for( int i=0 ; i<farmland.length ; i++ ){
for( int j=0 ; j<farmland[0].length() ; j++ ){
if( farmland[i].charAt(j) == 'C' ){
xPos.add(i);
yPos.add(j);
}
}
}
// 後半は各牛が鳴いたと仮定したときの不満の最小値を計算する
int minDissatisfaction = Integer.MAX_VALUE;
for( int i=0 ; i<xPos.size() ; i++ ){
int x = xPos.get(i); // x,yは特定の牛1頭の位置である
int y = yPos.get(i);
int curDissatisfaction = 0;
for( int j=0 ; j<xPos.size() ; j++ ){
if( i == j ) continue; // この箇所は無くてもOK
int cx = xPos.get(j);
int cy = yPos.get(j);
curDissatisfaction += (x-cx)*(x-cx)+(y-cy)*(y-cy);
}
if( curDissatisfaction < minDissatisfaction ) minDissatisfaction = curDissatisfaction;
}
return minDissatisfaction;
}
}得点は221.44/250、中央値は約196点。

0 件のコメント:
コメントを投稿