80分代码(此题主要考察cmath库的使用,注意,精度可以自己定义,默认是保留五位小数)
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
double pi=acos(-1);
long long dimen;
long long p_num;
long long r;
vector<long long> O;//represent the corordinate of the centre
vector<long long> P[2005];//store points
double dis_arr[2005][2005]={0};
double Disline(vector<long long> p1,vector<long long> p2)
{
long long size=p1.size();
double sum=0;
for(int i=0;i<size;i++)
{
sum+=(p1[i]-p2[i])*(p1[i]-p2[i]);
}
return sqrt(sum);
}
double dis(vector<long long> p1,vector<long long> p2)
{
long long size=p1.size();
double dis_p1o=Disline(p1,O);
double dis_p2o=Disline(p2,O);
double dis_p1p2=Disline(p1,p2);
double t1=asin(r/dis_p1o);
double t2=asin(r/dis_p2o);
double t3=acos(r/dis_p1o);
double t4=acos(r/dis_p2o);
double sum=acos((dis_p1o*dis_p1o+dis_p2o*dis_p2o-dis_p1p2*dis_p1p2)/(2*dis_p1o*dis_p2o));
double t5=sum-t3-t4;
double part1=dis_p1o*cos(t1);
double part2=dis_p2o*cos(t2);
double part3=t5*r;
if(t5<=0) return dis_p1p2;
else return part1+part2+part3;
}
int main()
{
cin>>dimen>>p_num>>r;
for(long long i=0;i<dimen;i++)
{
long long temp;
cin>>temp;
O.push_back(temp);
}
for(long long i=0;i<p_num;i++)
{
for(long long j=0;j<dimen;j++)
{
long long temp;
cin>>temp;
P[i].push_back(temp);
}
}
for(long long i=0;i<p_num;i++)
{
for(long long j=0;j<p_num;j++)
{
if(i==j) continue;
else
{
if(!dis_arr[i][j])
{
dis_arr[i][j]=dis(P[i],P[j]);
dis_arr[j][i]=dis_arr[i][j];
}
}
}
}
for(long long i=0;i<p_num;i++)
{
double temp=0;
for(long long j=0;j<p_num;j++)
{
if(i==j) continue;
else
{
temp+=dis_arr[i][j];
}
}
printf("%.14lf\n",temp);
}
}