作者:今生绝恋2702934494 | 来源:互联网 | 2024-11-08 13:55
本文介绍了洛谷P4035[JSOI2008]球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于ACM竞赛和其他相关应用场景。数据范围限制在10以内,确保了算法的高效性和准确性。
整理的算法模板合集: ACM模板
点我看算法全家桶系列!!!
实际上是一个全新的精炼模板整合计划
数据范围只开到了10,而且是经典的力学结构,所以我们可以用模拟退火,可以做一下 nnn 维的正交分解hhh,经典物理题。
然后实际上本题就是一个高斯消元模板题
apple pencil用习惯了,普通的笔写起来,字丑见谅
我用的是普通的高斯消元模板,因为听说高斯 - 约旦消元法有可能会被卡掉,所以学了,但是一直不敢用QWQ
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef int itn;
typedef pair<int, int>PII;
const int N &#61; 2007, mod &#61; 1e9 &#43; 7, INF &#61; 2.1e9;
const double eps &#61; 1e-8;int n, m;
double b[N][N];
double a[N][N];int guass(double a[][N])
{int c;int r;for(c &#61; 1, r &#61; 1; c <&#61; n; &#43;&#43; c){int t &#61; r;for(int i &#61; r &#43; 1; i <&#61; n; &#43;&#43; i){if(fabs(a[i][c]) > fabs(a[t][c]))t &#61; i;}if(fabs(a[t][c]) < eps)continue;for(int i &#61; c; i <&#61; n &#43; 1; &#43;&#43; i)swap(a[t][i], a[r][i]);for(int i &#61; n &#43; 1; i >&#61; c; -- i)a[r][i] /&#61; a[r][c];for(int i &#61; r &#43; 1; i <&#61; n; &#43;&#43; i)if(fabs(a[i][c]) > eps)for(int j &#61; n &#43; 1; j >&#61; c; -- j)a[i][j] -&#61; a[r][j] * a[i][c];r &#43;&#43; ;}if(r <&#61; n){for(int i &#61; r; i <&#61; n; &#43;&#43; i)if(fabs(a[i][n &#43; 1]) > eps)return 2;return 1;}for(int i &#61; n; i >&#61; 1; -- i)for(int j &#61; i &#43; 1; j <&#61; n &#43; 1; &#43;&#43; j)a[i][n &#43; 1] -&#61; a[j][n &#43; 1] * a[i][j]; return 0;
}int main()
{scanf("%d", &n);for(int i &#61; 1; i <&#61; n &#43; 1; &#43;&#43; i)for(int j &#61; 1; j <&#61; n; &#43;&#43; j)scanf("%lf", &a[i][j]);for(int i &#61; 1; i <&#61; n; &#43;&#43; i)for(int j &#61; 1; j <&#61; n; &#43;&#43; j){b[i][j] &#61; 2 * (a[i][j] - a[i &#43; 1][j]);b[i][n &#43; 1] &#43;&#61; a[i][j] * a[i][j] - a[i &#43; 1][j] * a[i &#43; 1][j];}guass(b);for(int i &#61; 1; i < n; &#43;&#43; i)printf("%.3f ", b[i][n &#43; 1]);printf("%.3f\n", b[n][n &#43; 1]);return 0;
}