このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
長方形の集まりが描かれる面は最初は完全に真白である。各長方形は厳密に直前に描いた長方形の内部に収まる。長方形は赤、青、緑の3色のどれかで描かれる。色は混じることがないので、長方形を別の長方形の内部に描いたとき、新しい色がその位置にあった既存の色を置き換えることになる。長方形の集まりはwidth[]とheight[]という整数型の配列とcolorという文字列で表される。i番目に描かれる長方形のサイズはwidth[i]とheight[i]である。そしてその色はcolorのi番目の文字である。文字は"R"、"G"、"B"の3つであり、それぞれ赤、緑、青を表している。すべての長方形が描かれたとき、赤、緑、青が占める面積を計算し、3つの面積の中から最大になるものの値を返せ。
私の解答はこちら。
public class ChainOfRectangles {
public int getMaximalArea(int[] width, int[] height, String color) {
int r = 0; // 各色ごとに見えている面積を表す変数
int g = 0;
int b = 0;
char prev = ' '; // 注目している長方形の直前の長方形の色を記録
for( int i=0 ; i<color.length() ; i++ ){
int iArea = width[i]*height[i]; // 注目する色の面積を増やす
char col = color.charAt(i);
if( col == 'R' ){
r += iArea;
}else if( col == 'G' ){
g += iArea;
}else{
b += iArea;
}
switch(prev){ // 直前の色の面積を減らす
case 'R':
r -= iArea;
break;
case 'G':
g -= iArea;
break;
case 'B':
b -= iArea;
break;
default:
break;
}
prev = col;
}
return Math.max(r, Math.max(g, b));
}
}得点は228.08/250、中央値は約197点。1回のsubmitでシステムテストクリア。実装要求の割にちょっと行数がおおいかな?
0 件のコメント:
コメントを投稿