2011/08/21

Topcoder SRM 515(Div.2) 参戦記

JAVAとC++を両方使った珍しいコンテストでした。


250点問題はJAVAで解きました。七面倒臭いプログラムになってしまったのは、私が JAVAやC++にまだ十分習熟していないためです。そのため、時間もかかってしまい、解けたのは176.96点でした。

続いて、500点問題をC++で解きました。この問題は楽しめたのですが、システムテストで落とされてしまいました。冷静に考えて後から再度書くとおりましたので、つまらないミスをしていたのでしょう。本記事に書いてあるのは通った方の正しいソースです。

500点問題について、試してみるという人が多かったのですが、私の解法を説明します。なお、Div.1の250点問題と同じです。
hourHand%30*2を計算することにより、分を求めることができます。これで、12時の方向からの回転角度を求め、時計を正しい方向に向けます。これがありえない角度になっていなければ、時計を読んでOKです。

問題はこちら.
得点は176.96、順位は694/1093、Rateは866->823でした。ちょっと最近不調でしょうか。もっとJAVAやC++のソースを書かないといけません。


[Level-one (JAVA)]

public class FortunateNumbers{
    public static int getFortunate(int[] a, int[] b, int[] c){
int sum=0;
int[][][] logs=new int[a.length][b.length][c.length];
for(int i=0;i<a.length;i++){
    for(int j=0;j<b.length;j++){
for(int k=0;k<c.length;k++){
    int tmp=a[i]+b[j]+c[k];
    if(isFortunate(tmp)==1) logs[i][j][k]=tmp;
    else logs[i][j][k]=0;
}
    }
}
for(int i=0;i<a.length;i++){
    for(int j=0;j<b.length;j++){
for(int k=0;k<c.length;k++){
    if(logs[i][j][k]==0) continue;
    for(int p=0;p<a.length;p++){
for(int q=0;q<b.length;q++){
    for(int r=0;r<c.length;r++){
if(i==p&&j==q&&k==r) continue;
if(logs[i][j][k]==logs[p][q][r]) logs[p][q][r]=0;
    }
}
    }
    sum++;
}
    }
}
return sum;
    }

    public static int isFortunate(int n){
while(n>0){
    if(n%10!=5 && n%10!=8) return 0;
    n/=10;
}
return 1;
    }
}


[Level-two (C++)]

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>

using namespace std;

class RotatedClock{
public:
  string getEarliest(int hourHand, int minuteHand){
    int hh=-1,mm=hourHand%30*2;
    int mdeg=mm*6;
    int dif=hourHand-minuteHand;
    if(dif<0) dif+=360;
    int hdeg=(mdeg+dif)%360;
    if(hdeg%30*2==mm) hh=hdeg/30;
    char str[10];
    if(hh>=0 && mm>=0){
      sprintf(str,"%02d:%02d",hh,mm);
      return string(str);
    }else return "";
  }
};

0 件のコメント:

コメントを投稿