問題
http://community.topcoder.com/stat?c=problem_statement&pm=2386&rd=4760
あるアンケートに対して、yesと答えた人の割合が%で与えられる。
このとき、その割合になるときに必要なアンケート人数の母数を求める。
ただし、小数点3位以下は四捨五入される。
解き方
最初に文字列からpを取りだすのにそのままの小数点を取りだすと、整数にしようと掛け算をした時に誤差が出てしまうので、文字から直接取りだした。
母数を1~10000まで順に操作し、
そのときのyesと答えた人の割合は切り捨てとなる場合と切り上げになる場合の
両方を検査する。
nで割ったときの判定については、nの半分を足すことで四捨五入の値を求めることができる。
コード
using namespace std;
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Percents {
public: int minSamples(string percent) {
int p=(percent[0]-'0')*1000+(percent[1]-'0')*100+(percent[3]-'0')*10+(percent[4]-'0');
FORE(n,1,10000){
int cost=n*p/10000;
if((cost*10000+n/2)/n==p)return n;
if(((cost+1)*10000+n/2)/n==p)return n;
}
return 10000;
}
};
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Percents {
public: int minSamples(string percent) {
int p=(percent[0]-'0')*1000+(percent[1]-'0')*100+(percent[3]-'0')*10+(percent[4]-'0');
FORE(n,1,10000){
int cost=n*p/10000;
if((cost*10000+n/2)/n==p)return n;
if(((cost+1)*10000+n/2)/n==p)return n;
}
return 10000;
}
};