Description
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
根据n+1个点的坐标,列出其到球心坐标距离的联等方程,移项就可以得到一个n元一次方程组。
然后高斯消元就可以了。
高斯消元在北京的时候有一道类似的题当时就写过,并且调了很久。
但是那道题没有AC,今天重新写了一遍直接过了。一直都是自己写的模板有时间去参考一些别人的写法。
program bzoj1013; const maxn=15; var n,i,j:longint; c,r,b:array[-1..maxn]of extended; a,l:array[-1..maxn,-1..maxn]of extended; procedure Gauss(step:longint); var i,j,head:longint; begin if step=1 then begin b[n]:=r[1]/l[1,n]; exit; end; head:=n-step+1; for i:=2 to step do begin r[i]:=r[i]*l[1,head]/l[i,head]; for j:=head+1 to n do l[i,j]:=l[i,j]*l[1,head]/l[i,head]; l[i,head]:=l[1,head]; end; for i:=1 to step-1 do begin r[i]:=r[i]-r[i+1]; for j:=head+1 to n do l[i,j]:=l[i,j]-l[i+1,j]; end; Gauss(step-1); for i:=head+1 to n do r[step]:=r[step]-b[i]*l[step,i]; b[head]:=r[step]/l[step,head]; end; begin readln(n); for i:=1 to n+1 do begin for j:=1 to n do read(a[i,j]); readln; end; for i:=1 to n+1 do begin c[i]:=0; for j:=1 to n do c[i]:=c[i]+sqr(a[i,j]); end; for i:=1 to n do begin r[i]:=(c[i+1]-c[i])/2; for j:=1 to n do l[i,j]:=a[i+1,j]-a[i,j]; end; Gauss(n); for i:=1 to n-1 do write(b[i]:0:3,' ');writeln(b[n]:0:3); end.