このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
あなたはいくつかアルゴリズムのテストをしており、一番早いものを見つけたいと思っている。アルゴリズムの計算量というのは、三つからなる。constant、power、logPowerである。これらは配列で与えられており、i番目のアルゴリズムは、次式で与えられる。
constant[i]*N^power[i]*log(N)^logPower[i]
上の3つの配列と、サイズを表すNが与えられたときに最も速い(計算量が少ない)アルゴリズムのインデックスを返せ(先頭は0から始まるものとして)。タイのものがある場合には、インデックスが最も小さいものを返せ。
私の解答はこちら。
public class ComputationalComplexity { public int fastestAlgo(int[] constant, int[] power, int[] logPower, int N) { // こういう風に定義するのもあり。こちらを利用する場合、int i=0からループを開始することになる。 // 解答の美しさを考慮すると、minはコメントにあるものの方が好きです。 // double min = Double.POSITIVE_INFINITY; double min = constant[0]*Math.pow(N, power[0])*Math.pow(Math.log(N),logPower[0]); int idx = 0; for( int i=1 ; i<constant.length ; i++ ){ double ith = constant[i]*Math.pow(N, power[i])*Math.pow(Math.log(N),logPower[i]); if( ith < min ){ idx = i; min = ith; } } return idx; } }
得点は205.78/250。数式をコードに落とすのに間違いがあり、解答にやや時間がかかってしまった。次の問題はSRM182 Div2 300Ptsと同じなので省略。
0 件のコメント:
コメントを投稿