标签:geo include 高斯 mes scan std www blank lin
。。。第一次打高斯消元
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1013
先考虑二维的情况:
设圆心A(x,y),给定的点B(a,b)
B 到圆心 A 的距离为 ( a - x ) ^ 2 + ( b - y ) ^ 2 = a ^ 2 - 2ax + x ^ 2 + b ^ 2 - 2by + y^2
假如还有一个点C(a1,b1)
则2(a1-a)x+2(b1-b)y=a1^2-a^2+b1^2-b^2
可以发现:n个点就可以列出 ( n - 1 ) 个不同的方程。
然后用一下高斯消元就行了。。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define M 20
using namespace std;
int n;
double pos[M],a[M][M],ans[M];
int main(){
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf",&pos[i]);
for(i=1;i<=n;i++){
double temp[M];
for(j=1;j<=n;j++){
scanf("%lf",&temp[j]);
a[i][j]=pos[j]-temp[j];
a[i][n+1]+=pos[j]*pos[j]-temp[j]*temp[j];
}
a[i][n+1]/=2;
}
for(i=1;i<=n;i++){
k=0;
for(j=i;j<=n;j++)
if( fabs(a[j][i])>fabs(a[k][i]) )
k=j;
for(j=1;j<=n+1;j++)
swap(a[i][j],a[k][j]);
for(j=i+1;j<=n;j++){
double temp=-a[j][i]/a[i][i];
for(k=i;k<=n+1;k++)
a[j][k]+=a[i][k]*temp;
}
}
for(i=n;i;i--){
for(j=n;j>i;j--)
a[i][n+1]-=a[i][j]*ans[j];
ans[i]=a[i][n+1]/a[i][i];
}
for(i=1;i<=n;i++)
printf("%.3lf%c",ans[i],i==n?‘\n‘:‘ ‘);
return 0;
}
This passage is made by Iscream-2001.
标签:geo include 高斯 mes scan std www blank lin
原文地址:http://www.cnblogs.com/Yuigahama/p/7723529.html