題目戳這裡
一句話題意
給你 n+1 個 n 維點,需要你求出這個n維球的球心。(n<=10)
solution
這個題目n維的話確實不好想,反正三維就已經把我搞懵了,所以只好拿二維模擬。
首先因為球心到邊上的點距離相等,所以我們可以列出三個式子:
設 球心座標為(\(x_0\),\(y_0\))
\((x_1-x_0)^2+(y_1-y_0)^2=r^2\)
\((x_2-x_0)^2+(y_2-y_0)^2=r^2\)
\((x_3-x_0)^2+(y_3-y_0)^2=r^2\)
三個式子中都有r和平方項不好計算,所以我們用1式減2式,2式減3式,就得到兩個式子:
\(x_1^2-x_2^2-2x_1x_0+2x_2x_0+y_1^2-y_2^2-2y_1y_0+2y_2y_0=0\)
\(x_2^2-x_3^2-2x_2x_0+2x_3x_0+y_2^2-y_3^2-2y_2y_0+2y_3y_0=0\)
而\(x_1,y_1,x_2,y_2,x_3,y_3\)都是已知的,可以看成常數項和係數。
再整理一下:
\(2(x_2-x_1)x_0+2(y_2-y_1)y_0=x_2^2-x1^2+y_2^2-y_1^2\)
\(2(x_3-x_2)x_0+2(y_3-y_2)y_0=x_3^2-x2^2+y_3^2-y_2^2\)
很明顯乙個二元一次方程組,然後使用高斯消元就可以求出球心。
這樣就很容易推到n維了,這裡就不一一寫出,大家自己手推一下吧。主要是太麻煩了
coding
#includeusing namespace std;
const int n = 105;
double s[n][n],ans[n],a[n][n];
int n,flag=1;
void solve(int x)
for(int i=x+1;i<=n;i++)
solve(x+1);
for(int i=n;i>=x+1;i--)
s[x][n+1]-=(ans[i]*s[x][i]);
ans[x]=s[x][n+1]/s[x][x];
return ;
}int main()
solve(1);
for(int i=1;i<=n;i++)
printf("%.3lf ",ans[i]);
return 0;
}
洛谷P4035 JSOI2008 球形空間產生器
思路 高斯消元 把所有已知點列出 可以得到n 1個方程 形如 a 1 a 2 b 1 b 2 n 1 n 2 dis a 2 a 2 b 2 b 2 n 2 n 2 dis a 3 a 2 b 3 b 2 n 3 n 2 dis 其中 dis是乙個定值 即每個點到球心的距離,a b c.為所求座標 ...
最大數 洛谷1198 JSOI2008
題意 現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。l 0 2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得...
洛谷1198 JSOI2008 最大數
題目 最大數 思路 線段樹。最開始就建乙個m個點的線段樹,這樣對數列增加的操作就變成線段樹的單點修改了。注意 在l 0時,要輸出0,所以不可以把線段樹的值初始化成 inf。另外注意邊界,不然會mle。建議在bzoj過了的也在luogu交一下,這題bzoj的資料比較水一點。includeusing n...