SRM574 DIV2 -Level2

問題


①数字が二つ与えられる。
②プレイヤーは一つ目の数字を10で割る、もしくは逆にすることができる。
③上記の操作によって、2つ目の数字にするとき、最小の操作回数を求める。
 2つ目の数字にできないときはー1を返す。

解き方


どのような法則があるか例を出して導く。

289が求めたい数字のとき、
元の数字:1289 →3回
2891 →1回
12891 →4回

つまり、
・最初から含まれる →文字数の差
・途中から含まれる →文字列の差+2

ひっくり返した場合もシミュレーションすると、
ひっくり返した文字が含まれる →文字数の差+1回

ただ求めたい数字の場合は両方一致するため、
返す数が少ない方から判定していく。

コード


class TheNumberGameDiv2 {

public:

string f(int n){
string str;
stringstream out;
out<<n;
out>>str;
return str;
}

int minimumMoves(int A, int B) {
string As=f(A);
string Bs=f(B);

int dis=As.size()-Bs.size();
int flag=0;

if(As.find(Bs)!=string::npos)flag=1;
if(As.find(Bs)==0)return dis;
reverse(Bs.begin(),Bs.end());

if(As.find(Bs)!=string::npos)return dis+1;
if(flag==1)return dis+2;

return -1;
}

};
このエントリーをはてなブックマークに追加