2012年4月9日月曜日

TopCoder SRM369 Div2 250Pts

この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 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計