SRM 460 div2 medium

SRM 460 div2 medium

かなりはまった。
i    0    1   2
cnt  4    2   1
  ----------------------------------------------
sum  20  15  30

このとき、cnt[0,i) / sum[0,i);
としてはいけない。なぜなら、それぞれの都市に行く確率は全く同じだから。
この図で言うと、i = 2; の都市に行く確率は1/3であって、30/65ではない。
考えれば当たり前のことも、思い込みって怖いね。



double find(vector  minJ, vector  maxJ, vector  minB, vector  maxB) {
		int cities = minJ.size();
		double ans = 0;  //return ans = cnt/sum;
		for(int i = 0; i < cities; i++) {  //J
			for(int j = 0; j < cities; j++) {  //B
				int sum = (maxJ[i]-minJ[i] + 1) * (maxB[j] - minB[j] + 1) * cities * cities;
				int tmp_min = min(maxJ[i], maxB[j]);
				int tmp_max = max(minJ[i], minB[j]);
				int cnt = 0;
				if(tmp_min >= tmp_max) {
					int tmp = tmp_min - tmp_max;
					cnt = (tmp + 1);
				}
				ans += (double)cnt / sum;

			}
		} //end for(i)
		return ans;

	}

赤い太字がポイント