<問題>
①N個の数字が与えられる。
例)42 911 666 17 13 1 1155 1094 815 5 1000 540
②一番最初の数字が自分の値。
③大きい数字の順から20個取り出され、R個の部屋にそれぞれランダムに割り当てられる。
④1個の部屋には20人まで収容できる。
⑤部屋の数はN/20、またNが20の倍数ならN/20+1。
⑤このとき、一番最大の数字と自分の数字が同じ部屋に割り当てられる確率を返す。
<関数>
数字がintではなくstringにて、空白区切りで与えられ、しかも複数のstringで与えられるのでvector<int>に戻す処理が必要。
FORE(i,0,ratings.size())strg+=ratings[i];
にて複数のstring配列を一つにし、
stringstream out(strg);
にて読み込み、
while(out >> tmp)vx.push_back(tmp);
にてvector<int>に挿入してます。
<考え方>
以下の場合に分けられる。
①数字が20個以内であれば、必ず同じ部屋になる。 →1
②自分の数字の順位が降順で部屋の数以内であれば、同じ部屋にならない。→0
③それ以外の場合、1/R。
また、Nの数字によってRの場合分けをする。
N=19 → (19+19)/20=1
N=20 → (20+19)/20=1
N=21 → (21+19)/20=2
となるので、R=(N+19)/20となり、
確率は1/((N+19)/20)。
double getProbability(vector<string> ratings) {
int n,tmp,rank=1,r;
vector <int> vx;
string strg="";
FORE(i,0,ratings.size())strg+=ratings[i];
stringstream out(strg);
while(out >> tmp)vx.push_back(tmp);
n=vx.size();
r=(n+19)/20;
FORE(i,0,n)if(vx[i]>vx[0])rank++;
if(n<=20)return 1;
if(r>=rank)return 0;
return (double)(1.0/r);
}
①N個の数字が与えられる。
例)42 911 666 17 13 1 1155 1094 815 5 1000 540
②一番最初の数字が自分の値。
③大きい数字の順から20個取り出され、R個の部屋にそれぞれランダムに割り当てられる。
④1個の部屋には20人まで収容できる。
⑤部屋の数はN/20、またNが20の倍数ならN/20+1。
⑤このとき、一番最大の数字と自分の数字が同じ部屋に割り当てられる確率を返す。
<関数>
数字がintではなくstringにて、空白区切りで与えられ、しかも複数のstringで与えられるのでvector<int>に戻す処理が必要。
FORE(i,0,ratings.size())strg+=ratings[i];
にて複数のstring配列を一つにし、
stringstream out(strg);
にて読み込み、
while(out >> tmp)vx.push_back(tmp);
にてvector<int>に挿入してます。
<考え方>
以下の場合に分けられる。
①数字が20個以内であれば、必ず同じ部屋になる。 →1
②自分の数字の順位が降順で部屋の数以内であれば、同じ部屋にならない。→0
③それ以外の場合、1/R。
また、Nの数字によってRの場合分けをする。
N=19 → (19+19)/20=1
N=20 → (20+19)/20=1
N=21 → (21+19)/20=2
となるので、R=(N+19)/20となり、
確率は1/((N+19)/20)。
double getProbability(vector<string> ratings) {
int n,tmp,rank=1,r;
vector <int> vx;
string strg="";
FORE(i,0,ratings.size())strg+=ratings[i];
stringstream out(strg);
while(out >> tmp)vx.push_back(tmp);
n=vx.size();
r=(n+19)/20;
FORE(i,0,n)if(vx[i]>vx[0])rank++;
if(n<=20)return 1;
if(r>=rank)return 0;
return (double)(1.0/r);
}