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); } }