0
点赞
收藏
分享

微信扫一扫

ZR #1176. 【线上训练 14】面积


题目链接:​​传送门​​(没买的看不了)

真的琢磨了好久好久

暴力很显然,枚举所有选出个点的情况然后叉乘计算面积
求出所有可能的面积之后除以情况个数就是期望面积
比赛的时候只能想到这样了

#include <bits/stdc++.h>
#define

using namespace std;
struct node {double x, y;}e[A];
int n, k, a[A], cnt, top, sta[A];
double x[A], y[A], ans;
double area() {
double s = 0;
for (int i = 1; i <= top; i++) e[i].x = x[sta[i]], e[i].y = y[sta[i]];
for (int i = 1; i < top; i++) s += e[i].x * e[i + 1].y;
s += e[top].x * e[1].y;
for (int i = 2; i <= top; i++) s -= e[i].x * e[i - 1].y;
s -= e[1].x * e[top].y; s /= 2;
return fabs(s);
}
void com(int n, int m) {
if (m == 0) {
cnt++; top = 0;
for (int i = 1; i <= k; i++) sta[++top] = a[k - i];
ans += area(); return;
}
for (int i = n; i >= m; i--) a[m - 1] = i, com(i - 1, m - 1);
}

int main(int argc, char const *argv[]) {
cin >> n >> k;
for (int i = 1; i <= n; i++) scanf("%lf%lf", &x[i], &y[i]);
for (int i = 1; i <= n; i++) a[i] = i;
com(n, k);
cout << fixed << setprecision(11) << ans / cnt << endl;
return 0;
}

期望具有线性性,也就是
那么我们可以算出某个面积与它发生的概率之积,这些乘积的和就是总期望
枚举,表示被选中了,且都没有被选中的情况
意思就是被删除但中间的点都没被删除
这个情况发生的概率可以通过组合数求出

#include <bits/stdc++.h>
#define

using namespace std;
long double x[A], y[A];
int n, k; long double ans, g[A];

int main(int argc, char const *argv[]) {
cin >> n >> k; g[k - 2] = 1;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
for (int i = 1; i <= k; i++) g[k - 2] *= double(k - i + 1) / double(n - i + 1); // 1 / C_n^k
for (int i = k - 1; i <= n; i++) g[i] = g[i - 1] * double(i) / double(i - k + 2); // 1 / C_n^(k-i)
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++) {
ans += (x[i] * y[j] - x[j] * y[i]) * g[j - i - 1];
ans += (x[j] * y[i] - x[i] * y[j]) * g[i + n - j - 1];
}
cout << fixed << setprecision(11) << ans / 2 << endl;
}


举报

相关推荐

0 条评论