The 2018 ACM-ICPC Chinese Collegiate Programming Contest
弧长=圆心角(弧度制)×半径
注:double是 %lf , long long 是 %lld;
通过余弦定理算∠p0p1p2,实际转过的角是π-∠p0p1p2;
或者通过向量算角度要方便一点
#include <iostream>
#include<cmath>
using namespace std;
double sz[55][2];
double bianlen[55];
double threebian[55];
double banjin[55];
double jiao[55];
double qx,qy;
double pi=acos(-1.0);
void jsbian(int x)
{
double a,b;
for(int i=0; i<x; i++)
{
a=(sz[i][0]-sz[(i+1)%x][0]);
b=(sz[i][1]-sz[(i+1)%x][1]);
bianlen[i]=sqrt(a*a+b*b);
}
}
void js3thbian(int x)
{
double a,b;
for(int i=0; i<x; i++)
{
a=(sz[i][0]-sz[(i+2)%x][0]);
b=(sz[i][1]-sz[(i+2)%x][1]);
threebian[i]=sqrt(a*a+b*b);
}
}
void jsR(int x)
{
double a,b;
for(int i=0; i<x; i++)
{
a=(sz[i][0]-qx);
b=(sz[i][1]-qy);
banjin[i]=sqrt(a*a+b*b);
}
}
void jsjiao(int x)
{
double a,b;
for(int i=0; i<x; i++)
{
a=(bianlen[i]*bianlen[i]+bianlen[(i+1)%x]*bianlen[(i+1)%x]-threebian[i]*threebian[i]);
b=(bianlen[i]*bianlen[(i+1)%x]*2.0);
jiao[(i+1)%x]=pi-acos(a/b);
}
}
int main()
{
double sum=0;
int t,n;
scanf("%d",&t);
for(int m=1; m<=t; m++)
{
// freopen("1.txt","a",stdout);
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%lf %lf",&sz[i][0],&sz[i][1]);
scanf("%lf %lf",&qx,&qy);
/*
cin>>sz[i][0]>>sz[i][1];
cin>>qx>>qy;*/
sum=0;
jsbian(n);
js3thbian(n);
jsR(n);
jsjiao(n);
for(int i=0; i<n; i++)
sum=sum+jiao[i]*banjin[i];
printf("Case #%d: %.3lf\n",m,sum);
}
return 0;
}