题解 | #一个经典概率问题#
一个经典概率问题
https://ac.nowcoder.com/acm/contest/11215/F
一个经典概率问题
解法其实已经写在题目里了,分别实现两种方法,然后根据两者不同的特征判断是哪一个方法生成的。
B的生成方法就不说了,L的生成方法由于每条半径生成方法是相同的,所以选哪一条半径其实都一样,不如直接固定选一个半径。
然后考虑使用均值判断,由于算出来两者相差还蛮大的,就直接用就行了。
#include <bits/stdc++.h> using namespace std; #ifdef BACKLIGHT #include "debug.h" #else #define debug(...) #endif const int T = 1e5; const int N = 1e5; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); inline int rnd(int l, int r) { return l + rng() % (r - l + 1); } double MB() { double mean = 0, r = N; for (int i = 0; i < T; ++i) { double x, y; while (true) { x = rnd(0, N); y = rnd(0, N); if (x * x + y * y <= r * r) break; } double a = sqrt(x * x + y * y); double b = 2 * sqrt(r * r - a * a); mean += b / N; } return mean / T; } double ML() { double mean = 0, r = N; for (int i = 0; i < T; ++i) { double a = rnd(0, N); double b = 2 * sqrt(r * r - a * a); mean += b / N; } return mean / T; } void solve(int Case) { double mb = MB(); double ml = ML(); int n; cin >> n; double d, mean = 0, std = 2 * 4 / acos(-1.0); for (int i = 0; i < n; ++i) cin >> d, mean += d; mean /= n; double db = abs(mean - mb); double dl = abs(mean - ml); debug(mean, mb, ml, db, dl); cout << (dl < db ? "L" : "B") << "\n"; } int main() { #ifdef BACKLIGHT freopen("a.in", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T = 1; // cin >> T; for (int t = 1; t <= T; ++t) solve(t); return 0; }