洛谷P4035 球形空间产生器 [JSOI2008] 高斯消元

正解:高斯消元

解题报告:

链接!

原本的式子是$\sum (a_i-x_i)^2=r^2$.发现是平方式根本不可做.

考虑拆式子之后变形,就会变成$2\cdot a_1\cdot x_1+2\cdot a_2\cdot x_2+..+2\cdot a_n\cdot x_n+({x_1}^2+{x_2}^2+...+{x_n}^2)=r^2-\sum {a_i}^2$

然后把这个$({x_1}^2+{x_2}^2+...+{x_n}^2)$看作一个新的未知数就好

好巧不巧的是它又刚好给的n+1个式子你就可以用它求出我们的n+1个未知数辣!(巧个屁,明明就是被出题人安排得明明白白

然后就放代码!完美结束$yep$!

#include<bits/stdc++.h>
using namespace std;
double a[][],inf=1e-,t[][];int w[];bool pd[];
long long read()
{
char ch=getchar();long long x=;bool y=;
while((ch!='-') && (ch>'' || ch<''))ch=getchar();
if(ch=='-')y=,ch=getchar();
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
void gsxy(int n)
{
for(int i=;i<=n;i++)
{
double mx=;int p=;
for(int j=;j<=n;j++)if(fabs(a[j][i])-inf>mx && pd[j]==)mx=fabs(a[j][i]),p=j;
w[i]=p;
pd[p]=;
for(int j=;j<=n;j++)
if(j!=p){double t=(double)a[j][i]*1.0000/a[p][i];for(int k=;k<=n+;k++)a[j][k]-=(double)t*a[p][k];}
}
for(int i=;i<n;i++)printf("%.3lf ",a[w[i]][n+]*1.00000/a[w[i]][i]);
}
int main()
{
int n=read();
for(int i=;i<=n+;i++)
{
for(int j=;j<=n;j++){scanf("%lf",&a[i][j]);a[i][n+]-=a[i][j]*a[i][j],a[i][j]*=-2.0;}
a[i][n+]=;
}
gsxy(n+);
return ;
}

这儿是代码

上一篇:关于Word中审阅的一个问题!


下一篇:修改WebLogic中Managed Server及Admin Server JVM大小 [final]