程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【BZOJ】1013: [JSOI2008]球形空間產生器sphere,bzojjsoi2008

【BZOJ】1013: [JSOI2008]球形空間產生器sphere,bzojjsoi2008

編輯:關於C語言

【BZOJ】1013: [JSOI2008]球形空間產生器sphere,bzojjsoi2008


【BZOJ】1013: [JSOI2008]球形空間產生器sphere

題意:給n+1個n維的點的坐標,要你求出一個到這n+1個點距離相等的點的坐標;

思路:高斯消元即第i個點和第i+1個點處理出一個式子,這樣n+1個點正好有n個系數的n元變量,即可求解。

式子:Σ( (a[i][j] - x[j])^2 )  = Σ( a[i+1][j] - x[j])^2 ) =>Σ( x[j]*[2*(a[i+1][j]-a[i][j])] ) = Σ(a[i+1][j]*a[i+1][j] - a[i][j]*a[i][j]);直接預處理即可;

注意:在Gauss處理出上三角陣的過程中,每次要選出主對角線絕對值最大的行作為參考行,貌似是精度問題。還有就是歸零的過程中,要變成參考行在消,為了不出現除0的情況。

 

#include<iostream> #include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath> #include<stdlib.h> #include<time.h> using namespace std; typedef long long ll; #define rep0(i,l,r) for(int i = (l);i < (r);i++) #define rep1(i,l,r) for(int i = (l);i <= (r);i++) #define MS0(a) memset(a,0,sizeof(a)) #define MS1(a) memset(a,-1,sizeof(a)) double a[11][11],A[12][12]; int n; void Gauss() { int i,j,k; rep1(i,1,n){ int mx = i; rep1(j,i+1,n) if(fabs(A[mx][i]) < fabs(A[j][i])) mx = j; rep1(j,i,n+1) swap(A[mx][j],A[i][j]); rep1(j,i+1,n)if(A[i][i] != 0){ double y = A[j][i]/A[i][i]; rep1(k,i,n+1) A[j][k] -= y*A[i][k]; } } for(int i = n;i >= 1;i--){ rep1(j,i+1,n) A[i][n+1] -= A[i][j] * A[j][n+1]; A[i][n+1] /= A[i][i]; //化為系數為1;保證有解,則A[i][i] != 0; } } int main() { int i,j; scanf("%d",&n); rep1(i,1,n+1) rep1(j,1,n) scanf("%lf",&a[i][j]); rep1(i,1,n) rep1(j,1,n){ A[i][j] = 2*(a[i+1][j] - a[i][j]); A[i][n+1] += a[i+1][j]*a[i+1][j] - a[i][j]*a[i][j]; } Gauss(); printf("%.3f",A[1][n+1]); rep1(i,2,n) printf(" %.3f",A[i][n+1]); } View Code

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved