このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。
A[]という整数型の配列が与えられる。Kという整数がAに対しirreducible(辞書では約されない、単純化できないという意味)とは、KがAの要素の和で表されないことを表す(各要素は高々1度しか使わない)。Aに対しirreducibleな最小の正の整数を返せ。
私の解答はこちら。この問題はAの要素数が1から3という小さい数なので全部の組合せを作成し、コーディングしています。
import java.util.ArrayList;
public class IrreducibleNumber {
public int getIrreducible(int[] A) {
int n = 1;
ArrayList<Integer> hs = new ArrayList<Integer>();
// 取り得る値の一覧を作成
if( A.length == 1){
hs.add(A[0]);
}else if( A.length == 2 ){
int[] list = {A[0], A[1], A[0]+A[1]};
for( int i=0 ; i<list.length ; i++ ){
hs.add(list[i]);
}
}else{
int[] list = {A[0], A[1], A[2], A[0]+A[1], A[1]+A[2], A[2]+A[0], A[0]+A[1]+A[2]};
for( int i=0 ; i<list.length ; i++ ){
hs.add(list[i]);
}
}
while( true ){ // 1から順番に値を取れるか検索
boolean isExist = false;
for( int i=0 ; i<hs.size() ; i++ ){
if( n == hs.get(i) ) isExist = true;
}
if( isExist == false){
break;
}
n++;
}
return n;
}
}得点は218.78/250、中央値は約215点。Aの最大長が3という制約がないとまともに実装できないコードにしてしまったのが残念、可変長で解けるようにしておきたかった。booleanでどの変数を組み込むかという状態を作成し、2^A.length-1通りためすのが良いのでしょう。ただし、相当重い動作になってしまうのでしょうけれど。

0 件のコメント:
コメントを投稿