Particle

競技プログラミングについての雑記

SRM 577

250

自分の部屋にいる人のレーティングの平均の期待値を求める問題です。

与えられる文字列を連結する。

部屋の数R = (n+20-1)/20
であり、(n-1)%R+1 人が最後に部屋分けされる。(このとき、1つの部屋に振り分けられる人数は20よりだいぶ小さくなることもある。)

の2つが分かれば、少し実装が大変ですが解けます。

int r[3000];

class EllysRoomAssignmentsDiv1{
public:
	double getAverage(vector <string> s) {
		int n = 0;
		memset(r,0,sizeof(r));
		
		string s2;
		for(int i = 0; i < s.size(); i++)s2 += s[i];
		stringstream ss(s2);
		while(ss>>r[n++]);//この方法で入力すると、nが1つ余計に多くなることに注意する
		if(!r[n-1])n--;
		
		int R = (n+19)/20;
		int me = r[0],mne;
		bool last = false;
		sort(r,r+n,greater<int>());
		for(int i = 0; i < n; i++)if(r[i]==me)mne = i;
		if(mne/R==(n-1)/R)last = true;
		int ex = (n-1)%R+1;
		
		double a = 0.0,b = 0.0;
		int sum = 0;
		for(int i = 0; i < n; i++){
			if(!(i%R)){
				a += (double)sum/R;
				sum = 0;
			}
			if(i/R!=mne/R) sum += r[i];
		}
		b = (double)sum/ex;
		
		int num = (n+R-1)/R;
		if(last) return (a+me)/num;
		else return (a+me)/(num-1)*(R-ex)/R+(a+me+b)/num*ex/R;
 	}
};

--- 0

1456 -> 1412