SRM 462 DIV1 Easy - AgeEncoding

問題


http://community.topcoder.com/stat?c=problem_statement&pm=10589&rd=14147

1と0からなる数が与えられ、これをx進数にすることでnを表したい。
xは整数でなくても良いとき、xを求める。

ただしそのようなxが存在しない場合は−1を、
複数存在する場合は−2を返す。

解き方


2分探索の問題。

あとは例外判定が重要になる。

①N=1のときは1のとき複数の場合があるので−2、
 また一番下の桁が1で、その他の桁がすべて0でない場合は−1になる。
②nは1以上のため、すべて0のときは−1となる。
③N=1でなくすべて1のときは表すことができないので−1となる。

コード


class AgeEncoding {

public:

double calc(double b,string s){
int n=s.size();
double sum=0.0;

double p=1;
for(int i=n-1;i>=0;i--){
if(s[i]=='1')sum+=p;
p*=b;
if(sum>100)return sum;
}
return sum;
}

double getRadix(int age, string candles) {
int n=candles.size();

int valid=1;
FORE(i,0,n-1)if(candles[i]!='0')valid=0;

if(age==1){
if(!valid && candles[n-1]=='1')return -1;
if(valid && candles[n-1]=='1')return -2;
}
if(valid && candles[n-1]=='1')return -1;
if(valid && candles[n-1]=='0')return -1;

double low=0,high=1e+9;
FORE(i,0,1000){
double mid=(low+high)/2.0;
if(calc(mid,candles)<=age)low=mid;
else high=mid;
}

return low;
}

};

Share this

Related Posts

Previous
Next Post »