2011-0100
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
这道题大意是这样:在一个11维空间中,有一个点P,给出11个点和它们到P的距离,求点P。
直接整理方程然后做高斯消元就可以了。
#include <cstdio>
const double eps=1e-6;
int test;
double x[13][13],a[13][13];
double s[13],y[12];
void swap(double &x,double &y)
{
double o=x;
x=y;y=o;
return;
}
bool zero(double x)
{
if((x<=eps)&&(x>=-eps)) return true;
else return false;
}
void print(int o)
{
for(int i=o;i<=11;i++)
{
for(int j=o;j<=11;j++) printf("%.3lf ",x[i][j]);
printf("%.3lf\n",x[i][12]);
}
}
void jie(int k)
{
//print(k);////////////////
//printf("%d %.2lf\n",k,x[k][k]);////////////
if(k==11)
{
y[11]=x[11][12]/x[11][11];
return;
}
if(zero(x[k][k]))
{
int o=k;
while(zero(x[o][k]==0)) o++;
for(int i=k;i<=12;i++) swap(x[i][k],x[k][i]);
}
double p;
for(int i=k+1;i<=11;i++)
{
p=x[i][k]/x[k][k];
for(int j=k+1;j<=12;j++)
x[i][j]=x[i][j]-p*x[k][j];
}
//print(k);//////////
jie(k+1);
p=x[k][12];
for(int i=k+1;i<=11;i++) p=p-x[k][i]*y[i];
y[k]=p/x[k][k];
return;
}
int main()
{
scanf("%d",&test);
for(;test;test--)
{
for(int i=1;i<=12;i++)
{
for(int j=1;j<=11;j++) scanf("%lf",&x[i][j]);
scanf("%lf",&s[i]);
}
for(int i=1;i<=12;i++)
{
s[i]=s[i]*s[i];
for(int j=1;j<=11;j++)
{
s[i]=s[i]-x[i][j]*x[i][j];
x[i][j]=2*x[i][j];
}
x[i][12]=-s[i];
}
for(int i=1;i<=11;i++)
for(int j=1;j<=12;j++) x[i][j]=x[i][j]-x[12][j];
jie(1);
for(int i=1;i<=10;i++) printf("%.2lf ",y[i]);
printf("%.2lf\n",y[11]);
}
}
by hzwlzrj
这道题大意是这样:在一个11维空间中,有一个点P,给出11个点和它们到P的距离,求点P。
直接整理方程然后做高斯消元就可以了。
#include
const double eps=1e-6;
int test;
double x[13][13],a[13][13];
double s[13],y[12];
void swap(double &x,double &y)
{
double o=x;
x=y;y=o;
return;
}
bool zero(double x)
{
if((x<=eps)&&(x>=-eps)) return true;
else return false;
}
void print(int o)
{
for(int i=o;i<=11;i++)
{
for(int j=o;j<=11;j++) printf("%.3lf ",x[i][j]);
printf("%.3lf\n",x[i][12]);
}
}
void jie(int k)
{
//print(k);////////////////
//printf("%d %.2lf\n",k,x[k][k]);////////////
if(k==11)
{
y[11]=x[11][12]/x[11][11];
return;
}
if(zero(x[k][k]))
{
int o=k;
while(zero(x[o][k]==0)) o++;
for(int i=k;i<=12;i++) swap(x[i][k],x[k][i]);
}
double p;
for(int i=k+1;i<=11;i++)
{
p=x[i][k]/x[k][k];
for(int j=k+1;j<=12;j++)
x[i][j]=x[i][j]-p*x[k][j];
}
//print(k);//////////
jie(k+1);
p=x[k][12];
for(int i=k+1;i<=11;i++) p=p-x[k][i]*y[i];
y[k]=p/x[k][k];
return;
}
int main()
{
scanf("%d",&test);
for(;test;test--)
{
for(int i=1;i<=12;i++)
{
for(int j=1;j<=11;j++) scanf("%lf",&x[i][j]);
scanf("%lf",&s[i]);
}
for(int i=1;i<=12;i++)
{
s[i]=s[i]*s[i];
for(int j=1;j<=11;j++)
{
s[i]=s[i]-x[i][j]*x[i][j];
x[i][j]=2*x[i][j];
}
x[i][12]=-s[i];
}
for(int i=1;i<=11;i++)
for(int j=1;j<=12;j++) x[i][j]=x[i][j]-x[12][j];
jie(1);
for(int i=1;i<=10;i++) printf("%.2lf ",y[i]);
printf("%.2lf\n",y[11]);
}
}
by hzwlzrj