Bzoj1013--Jsoi2008球形空间产生器

竟然会想去用随机艹这道题。。。太年轻

实际上两个点与坐标列一个方程,高斯消元解这n个方程组就好了。

讲道理随机也可以过的吧?

主要是不好找一个单调的状态来退火或者爬山

因为超出圆范围外无限远处到所有点距离也相等,但并不是圆心。

大概可以先用到所有点距离和来爬一下山,最终点就肯定在圆里,在小步小步的爬山,强制使自己陷入这个局部最优解。

也许可行?

高斯代码:

#include<bits/stdc++.h>
#define MAXN 12
#define INF 100000000
#define eps 1e-9
using namespace std;

int n;
double x[MAXN][MAXN],gs[MAXN][MAXN];

inline double _pow(double a) {return a*a;};
inline double _abs(double a) {return a>0?a:-a;}

int main() {
    scanf("%d",&n);n++;
    for(int i=1;i<=n;i++) for(int j=1;j<n;j++) scanf("%lf",&x[i][j]);
    for(int i=1;i<n;i++) for(int j=1;j<n;j++) gs[i][0]+=_pow(x[i][j])-_pow(x[i+1][j]);
    for(int i=1;i<n;i++) for(int j=1;j<n;j++) gs[i][j]=2*(x[i][j]-x[i+1][j]);
    for(int pos,i=1;i<n;i++) {
        for(int j=i;j<n;j++) if(_abs(gs[j][i])>eps) {pos=j;break;}
        swap(gs[pos],gs[i]);
        for(int j=1;j<n;j++) if(_abs(gs[j][i])>eps&&j!=i) {
            double p=(-gs[j][i])/gs[i][i];
            for(int k=0;k<n;k++) gs[j][k]+=gs[i][k]*p;
        }
    }
    printf("%.3lf",gs[1][0]/gs[1][1]);
    for(int i=2;i<n;i++) printf(" %.3lf",gs[i][0]/gs[i][i]);
    printf("\n");
    return 0;
}

 

转载于:https://www.cnblogs.com/ihopenot/p/5922712.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值