注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

时光机TimeMachine

——一个退役OIer

 
 
 

日志

 
 

[BZOJ:1013][JSOI2008]球形空间产生器sphere  

2014-08-07 16:23:36|  分类: Problems |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
@[BZOJ:1013][JSOI2008]球形空间产生器sphere
高斯消元(入门题?
现在才学高斯消元我真是弱(╯‵□′)╯︵┻━┻

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 11;
int n,m;
typedef double Matrix[N][N];
Matrix f;
void gauss(int n){
int i,j,k,r;
for(i=0;i<n;i++){
r=i;
for(j=i+1;j<n;j++)
if(fabs(f[j][i]) > fabs(f[r][i]))r=j;
if(r!=i)for(j=i;j<=n;j++)swap(f[r][j],f[i][j]);

for(k=i+1;k<n;k++){
double l = f[k][i]/f[i][i];
for(j=i;j<=n;j++)
f[k][j] -= f[i][j]*l;
}
}
for(i=n-1;i>=0;i--){
for(j=i+1;j<n;j++) f[i][n] -= f[i][j]*f[j][n];
f[i][n]/=f[i][i];
}
}
int main(){
int i,j;
scanf("%d",&n);
for(i=0;i<=n;i++){
for(j=0;j<n;j++){
scanf("%lf",&f[i][j]);
f[i][n]-=f[i][j]*f[i][j];
f[i][j]*=-2.0;
if(i) f[i-1][j] -= f[i][j];
}
if(i) f[i-1][n] -= f[i][n];
}
gauss(n);
printf("%.3f",f[0][n]);
for(i=1;i<n;i++)
printf(" %.3f",f[i][n]);
return 0;
}

题解:
把每一维作为一个变量,到球心的距离作为一个变量
这样就有n+1个变量,n+1个方程
但是这样是二次方程,没有办法用高斯消元
答案只需要n个
但是我们现在却有n+1个方程?
尝试把每个方程展开
发现作差可以使得二次项全部被消去
这样就得到n个方程
高斯消元解决
  评论这张
 
阅读(40)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017