一个经典概率问题
解法其实已经写在题目里了,分别实现两种方法,然后根据两者不同的特征判断是哪一个方法生成的。
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;
} 
京公网安备 11010502036488号