2011年5月29日日曜日

Topcoder SRM507(Div.2)参戦記

久しぶりに書きます。次の日が休みということで、終わったあとすぐに書いています。

いつも通り開始。今回は途中休憩に250を当てようということで、まずは500から解きます。

色の塗り分け問題です。正方形の各面を、与えられた色で塗り分けられるかどうかを考えます。隣り合った面を同じ色で塗ってはいけません。塗り分けられますか?というものです。一色は2回しか使えませんから、最大カウントを2回として、いったい何色使えるかを数えればOKです。Submitして通り、374.77点。

次に250です。これはかなり単純で、場合分けをして考えればOKです。228.59でSubmit。

その後1000を解こうとしたのですが、フェルマーの4n+1定理、三平方和定理、四角数定理などと考えて、うまい方法が思いつかず、そのまま撃沈でした。

チャレンジフェーズでは一つ見つけたのですが追いつかず、他の人がわずかに早くとってしまいました。初チャレンジかと思ったのですが、惜しかったです。

合計点で、順位は370/1367でした。久しぶりでしたが、楽しかったです。後は、JavaもしくはC++にもっと慣れなければなりません。Cと僅かな道具で戦っているだけでは、正直厳しいと思っています。(が、その向上にあまり時間をかけられていないのが実情です…)。

私の拙い解答ソースコードです。Javaなので、いつも以上に下手くそです。
250.

public class CubeAnts{
  public static int getMinimumSteps(int[] pos){
    int num=0;
    for(int i=0;i<pos.length;i++){
      if(pos[i]==6) return 3;
      else if(pos[i]==2 || pos[i]==5 || pos[i]==7) num=(num<2)?2:num;
      else if(pos[i]==1 || pos[i]==3 || pos[i]==4) num=(num<1)?1:num;
    }
    return num;
  }
}


500.

public class CubeStickers{
public static String isPossible(String[] sticker){
int color=0;
for(int i=0;i<sticker.length;i++){
  color++;
  if(i==0) continue;
  int count=0;
  for(int j=i-1;j>=0;j--){
     if(sticker[i].equals(sticker[j])) count++;
     if(count==2){
       color--;
       break;
     }
  }
  if(color>=6) break;
}
if(color>=6) return "YES";
return "NO";
}
}

0 件のコメント: