洛谷 4035 JSOI2008 球形空間產生器

2022-04-29 20:03:10 字數 1302 閱讀 5580

題目戳這裡

一句話題意

給你 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...