A - Piece of Cake Kattis - pieceofcake (数学)
Posted letlifestop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A - Piece of Cake Kattis - pieceofcake (数学)相关的知识,希望对你有一定的参考价值。
题目链接:
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 }
以上是关于A - Piece of Cake Kattis - pieceofcake (数学)的主要内容,如果未能解决你的问题,请参考以下文章
1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts (M)
leetcode1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts