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