题目链接:
题目大意:
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
思路:
每两个可以构成一个n个变量的式子,可以构造出n个不同的式子,进行高斯消元求解。
高斯消元模板:
1 typedef double Matrix[maxn][maxn]; 2 void gauss(Matrix A, int n) 3 { 4 for(int i = 0; i < n; i++) 5 { 6 int r = i; 7 for(int j = i + 1; j < n; j++) 8 if(fabs(A[j][i]) > fabs(A[r][i]))r = j; 9 if(r != i)for(int j = 0; j <= n; j++)swap(A[r][j], A[i][j]);10 for(int k = i + 1; k < n; k++)11 {12 double f = A[k][i] / A[i][i];13 for(int j = i; j <= n; j++)A[k][j] -= f * A[i][j];14 }15 }16 17 for(int i = n - 1; i >= 0; i--)18 {19 for(int j = i + 1; j < n; j++)20 {21 A[i][n] -= A[j][n] * A[i][j];22 }23 A[i][n] /= A[i][i];24 }25 }
1 #include2 #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf 3 #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时 4 #define Min(a, b) ((a) < (b) ? (a) : (b)) 5 #define Mem(a) memset(a, 0, sizeof(a)) 6 #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1)) 7 #define MID(l, r) ((l) + ((r) - (l)) / 2) 8 #define lson ((o)<<1) 9 #define rson ((o)<<1|1)10 #pragma comment(linker, "/STACK:102400000,102400000")//栈外挂11 using namespace std;12 inline int read()13 {14 int x=0,f=1;char ch=getchar();15 while (ch<'0'||ch>'9'){ if (ch=='-') f=-1;ch=getchar();}16 while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}17 return x*f;18 }19 20 typedef long long ll;21 const int maxn = 10 + 10;22 const int mod = 100003;//const引用更快,宏定义也更快23 const int INF = 1e9;24 typedef double Matrix[maxn][maxn];25 double a[maxn][maxn];26 double tmp[maxn][maxn];27 void gauss(Matrix A, int n)28 {29 for(int i = 0; i < n; i++)30 {31 int r = i;32 for(int j = i + 1; j < n; j++)33 if(fabs(A[j][i]) > fabs(A[r][i]))r = j;34 if(r != i)for(int j = 0; j <= n; j++)swap(A[r][j], A[i][j]);35 for(int k = i + 1; k < n; k++)36 {37 double f = A[k][i] / A[i][i];38 for(int j = i; j <= n; j++)A[k][j] -= f * A[i][j];39 }40 }41 42 for(int i = n - 1; i >= 0; i--)43 {44 for(int j = i + 1; j < n; j++)45 {46 A[i][n] -= A[j][n] * A[i][j];47 }48 A[i][n] /= A[i][i];49 }50 }51 int main()52 {53 int n;54 scanf("%d", &n);55 for(int i = 0; i <= n; i++)56 for(int j = 0; j < n; j++)scanf("%lf", &a[i][j]);57 for(int i = 1; i <= n; i++)58 {59 for(int j = 0; j < n; j++)60 {61 tmp[i - 1][n] -= a[0][j] * a[0][j];62 tmp[i - 1][n] += a[i][j] * a[i][j];63 }64 for(int j = 0; j < n; j++)65 tmp[i - 1][j] = 2.0 * (a[i][j] - a[0][j]);66 }67 gauss(tmp, n);68 for(int i = 0; i < n; i++)69 {70 if(i == 0)printf("%.3lf", tmp[i][n]);71 else printf(" %.3lf", tmp[i][n]);72 }73 puts("");74 return 0;75 }