問題
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;
}
};
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;
}
};