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 件のコメント:
コメントを投稿