2011年4月24日日曜日

TopCoder SRM176 Div2 250Pts

本日の問題はこちら(要TopCoder登録 & 問題文は英語)。

問題のおおまかな訳は以下のようになる。

視覚に訴えかけるメディアでは、特定の部分を引き立たせるため、ある色の補色を考えることがある。補色というのは、画像のRGB値が0-255の範囲で表される場合、RGBのそれぞれの値に対し、255から引き算した値に変換することによって得ることができる。

ただし、RGBの値が128に近いとあまり目立たせることができない。そこで、上記の変換の前後でRGB値の変化がすべて32以下であれば、128足すか引くということを0-255の範囲に収まるように行う。例えば(r,g,b)=(120,130,140)の補色の関係にある色は(r,g,b)=(135,125,115)となるが、いずれの色の変化も32以下なので、(r,g,b)=(120+128,130-128,140-128)=(248,2,12)という変換を行う。130や140に128を足すと255を超えるので、引くことにしなければならないことに注意。

入力rgb[]が与えられたときに、rgb[]の補色を返すようなメソッドgetComplementを作成せよ。クラス名はRGBColorとする。

public class RGBColor {

 public int[] getComplement(int[] rgb) {
  int[] myrgb = new int[rgb.length];
  boolean flg = false;
  for( int i=0 ; i<rgb.length ; i++ ){
   myrgb[i] = 255-rgb[i];
   if( Math.abs(myrgb[i]-rgb[i])>32 ){
    flg = true;
   }
  }
  if( flg == true ){
   return myrgb;
  }else{
   for( int i=0 ; i<rgb.length ;i++){
    if( rgb[i]<=127 ){
     myrgb[i] = rgb[i]+128;
    }else{
     myrgb[i] = rgb[i]-128;
    }
   }
   return myrgb;
  }
 }

}

点数は250点満点の205.14、正解率を考えればまずまずといったところ。最初はflg=trueと書いてバグが出ていたので、それがなければもう少し点数を稼げたかと。

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計