牛客多校賽2K Keyboard Free


Description

給定 \(3\) 個同心圓,半徑分別為 \(r1,r2,r3\) ,三個點分別隨機分布在三個圓上,求這個三角形期望下的面積。

Solution

首先可以固定 \(A\) 點,枚舉 \(B\) 點。
對於一個固定的 \(AB\) ,我們可以求出線段長度 \(L\) 以及它與圓心的距離 \(H\) 和夾角 \(\alpha\) ,顯然有 \(alpha < \frac{\pi}{2}\)
接着通過積分求出 \(C\) 點運動時這個三角形的期望高,我們將其分成三部分。
第一部分:

\[sum=\int_{0}^{\pi}(H+r3\times sin(x))dx=\pi H + r3\times \int_{0}^{\pi}sin(x)dx=\pi H+2\times r3 \]

第二部分:

\[sum=2\int_{0}^{\alpha}(H-r3\times sin(x))dx=2(H\alpha - r3\int_{0}^{\alpha}sin(x)dx)=2(\alpha H +r3\times cos(\alpha)-r3) \]

第三部分:

\[sum=\int_{\alpha}^{\pi-\alpha}(r3\times sin(x)-H)dx=r3\int_{\alpha}^{\pi-\alpha}sin(x)dx-(\pi-2\alpha)H=2r3\times cos(\alpha)-(\pi-2\alpha)H \]

合並在一起,得:

\[sum=\pi H+2\times r3+2(\alpha H +r3\times cos(\alpha)-r3)+2r3\times cos(\alpha)-(\pi-2\alpha)H=4r3\times cos(\alpha)+4\alpha\times H \]

所以,期望高度為 \(h=\frac{4r3\times cos(\alpha)+4\alpha\times H}{2\pi}\) ,故期望三角形面積為 \(\frac{h\times L}{2}\)
我們可以在圓周上均勻選取 \(1000\)\(B\) ,這樣做答案近似度極高,如只保留一位小數精度足矣。
時間復雜度:\(O(1000T)\)

Code

提交記錄

// Author: wlzhouzhuan
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ull unsigned long long
#define rint register int
#define rep(i, l, r) for (rint i = l; i <= r; i++)
#define per(i, l, r) for (rint i = l; i >= r; i--)
#define mset(s, _) memset(s, _, sizeof(s))
#define pb push_back
#define pii pair <int, int>
#define mp(a, b) make_pair(a, b)
#define debug(x) cerr << #x << " = " << x << '\n';
#define pll pair <ll, ll>

inline int read() {
  int x = 0, neg = 1; char op = getchar();
  while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); }
  while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); }
  return neg * x;
}
inline void print(int x) {
  if (x < 0) { putchar('-'); x = -x; }
  if (x >= 10) print(x / 10);
  putchar(x % 10 + '0');
}

const double eps = 1e-8;
const double PI = acos(-1.0);

double Sin[1005], Cos[1005];
double r1, r2, r3;

double sqr(double x) { return x * x; }
void solve() {
  cin >> r1 >> r2 >> r3;
  if (r1 > r2) swap(r1, r2);
  if (r1 > r2) swap(r1, r3);
  if (r2 > r3) swap(r2, r3);
  double ans = 0.0;
  for (int i = 1; i <= 1000; i++) {
    // B 坐標 
    double X = r2 * Cos[i], Y = r2 * Sin[i];
    double L = sqrt(sqr(X - r1) + sqr(Y));
    double H = Y / L * r1;
    double alpha = asin(H / r3);
    double h = (4.0 * r3 * cos(alpha) + 4.0 * alpha * H) / (2.0 * PI);
    ans += h * L / 2.0;
  }   
  ans /= 1000.0;
  cout << fixed << setprecision(1) << ans << '\n';
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int T;
  cin >> T;
  for (int i = 1; i <= 1000; i++) {
    Sin[i] = sin(2.0 * PI / 1000.0 * i);
    Cos[i] = cos(2.0 * PI / 1000.0 * i);
  }
  while (T--) solve();
  return 0; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM