题目链接:
A - Piece of Cake
题目大意:给你一个多边形,然后给你这个多边形的每个点的坐标,让你从这个n个点中选出k个点,问这个k个点形成的面积的期望。
具体思路:我们肯定不能硬跑每一个k边形,肯定会超时。我们以每个点作为起点,从这个点开始,形成的面积的期望是多少,然后遍历每一个点,这样算出来的会有重复,最后除以2就可以了。
然后算面积的时候,我们分开算。一个多边形的面积等于每个点按照顺时针或者是逆时针两个点之间的叉积。
求组合数的时候,用递推的方法。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 2e5+100; 6 struct node{ 7 long double x,y; 8 }q[maxn]; 9 long double cal(int t1,int t2){ 10 return (q[t1].x*q[t2].y-q[t1].y*q[t2].x); 11 } 12 long double c[3000][3000]; 13 int main(){ 14 int n,k; 15 scanf("%d %d",&n,&k); 16 for(int i=0;i<n;i++){ 17 cin>>q[i].x>>q[i].y; 18 } 19 for(int i=0;i<=n;i++){ 20 c[0][i]=0; 21 c[i][0]=1; 22 } 23 for(int i=1;i<=n;i++){ 24 for(int j=1;j<=i;j++){ 25 c[i][j]=c[i-1][j]+c[i-1][j-1]; 26 } 27 } 28 long double ans=0; 29 for(int i=0;i<n;i++){ 30 for(int j=k-1;j<n;j++){ 31 int to=(i+j)%n; 32 ans+=cal(i,to)*c[j-1][k-2]/c[n][k]; 33 //cout<<cal(i,to)<<" "<<c[j-1][k-1]<<" "<<c[n][k]<<endl; 34 } 35 } 36 //cout<<ans<<endl; 37 ans/=2.0; 38 cout<<fixed<<setprecision(6)<<ans<<endl; 39 }
原文地址:https://www.cnblogs.com/letlifestop/p/10676011.html
时间: 2024-11-10 11:36:41