题解 | #一个经典概率问题#

一个经典概率问题

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;
}
全部评论

相关推荐

评论
1
收藏
分享
牛客网
牛客企业服务