202009-4 星际旅行


思路:

这道题就是简单的数学题,只不过被n维吓住了而已,只需要按照二维的思路处理n维即可。

代码:

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 105;
const int M = 2005;
int o[N];//圆点坐标
double d[M];//点到圆点距离
double rd[M];//点的切线距离
int p[M][N];//点的坐标 
int n,m;
double r;
double ans[M];
inline double sqr(double x){
    return x * x;
}
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin>>n>>m;
    cin>>r;
    for(int i = 0;i){
        cin>>o[i];
    }
    for(int i = 0;i){
        double s = 0;
        for(int j = 0;j){
            cin>>p[i][j];
            s += sqr(p[i][j] - o[j]);
        }
        d[i] = sqrt(s);//求出点到圆心距离 
        rd[i] = sqrt(s - sqr(r));//求出切线距离 
    }
    for(int i = 0;i){
        for(int j = 0;j){
            double s = 0;
            for(int k = 0;k){
                s += sqr(p[i][k] - p[j][k]);
            }
            double c = sqrt(s);
            double a = d[i];
            double b = d[j];
            double t = (a + b + c) / 2;
            double area = sqrt(t * (t - a) * (t - b) * (t - c));
            double h = 2 * area / c;
            if(h >= r || sqr(a) >= sqr(b) + s || sqr(b) >= sqr(a) + s){
                ans[i] += c, ans[j] += c;
                continue;
            }
            double angle = acos((sqr(a) + sqr(b) - sqr(c)) / (2 * a * b));
            double angle1 = acos( r / a);
            double angle2 = acos( r / b);
            double res = (angle - angle1 - angle2) * r + rd[i] + rd[j];
            ans[i] += res, ans[j] += res;
        }
    }
    for(int i = 0;i){
        printf("%.13f\n", ans[i]);
    }
}
csp