TopCoder SRM 356 Div1 Easy AverageProblem
問題
n人にアンケートをした。m個の質問に対して、
それぞれの人は0〜10までの数字を答えた。
それぞれの質問に対する答えの平均値が、
小数点以下3桁未満を切り捨てて与えられる。
このとき、nとしてありうる数は最低でいくつか、求めよ。
制約条件
m≦2500くらい?
方針
人数は1000人いれば必ずどんな小数点以下3桁の値も作れるので、
1000人以下の人数で適切なnを探してやればよい。
平均値がaであるような質問に対して、数値の合計値をxとすると、
x/n=a+(三桁未満)……
となっているはずで、1000*x/n=a+(小数点以下)になっている。
なので、xはa*n/1000を切り上げたものになるはず。
このxから、平均値を逆算したときにaになっていればおk.
ソースコード
class AverageProblem { public: int numberOfParticipants(vector <string> marks) { string s; rep(i,marks.size())s+=" "+marks[i]; stringstream ss(s); vi nums; while(ss>>s){ int x,y; sscanf(s.c_str(),"%d.%d",&x,&y); nums.pb(x*1000+y); } int n=nums.size(); for(int i=1;i<=1000;i++){ rep(j,n){ int x=(i*nums[j]+999)/1000; if(1000*x/i!=nums[j])goto NEXT; } return i; NEXT:; } } };