作者:今生绝恋2702934494 | 来源:互联网 | 2024-11-08 13:55
本文介绍了洛谷P4035[JSOI2008]球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于ACM竞赛和其他相关应用场景。数据范围限制在10以内,确保了算法的高效性和准确性。
整理的算法模板合集: ACM模板
点我看算法全家桶系列!!!
实际上是一个全新的精炼模板整合计划
数据范围只开到了10,而且是经典的力学结构,所以我们可以用模拟退火,可以做一下 nn n 维的正交分解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 ; }