Gym 100962A ABBA (高斯消元)
2016-09-28 19:33
344 查看
题意:给一个规模为n*m目标矩阵,你当前拥有一个同等规模的0矩阵,你可以通过构造多对n*1和1*m的矩阵通过加法来获得目标矩阵,如果不能则输出-1
首先我们观察每一对构造出来的矩阵的值,可以使得某一个特定的位为任何数而其余都为0,所以不难想到,将目标矩阵等价化成行最简矩阵,然后就可以操作使得矩阵的每一行只有一个非0数或全为0,这样就转化成了求矩阵的秩,然后显然就用得到高斯消元了,高斯消元当然要注意精度问题,这个题要求0.01(鬼知道这个题第30组数据是什么样,卡了很久)
代码如下:
首先我们观察每一对构造出来的矩阵的值,可以使得某一个特定的位为任何数而其余都为0,所以不难想到,将目标矩阵等价化成行最简矩阵,然后就可以操作使得矩阵的每一行只有一个非0数或全为0,这样就转化成了求矩阵的秩,然后显然就用得到高斯消元了,高斯消元当然要注意精度问题,这个题要求0.01(鬼知道这个题第30组数据是什么样,卡了很久)
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=500; const double EPS=1e-2; double a[maxn][maxn]; int n,m; int Gauss() { for(int i=0; i<n; i++) { int r=i; for(int j=i+1; j<n; j++) if(fabs(a[i][j]) > fabs(a[r][i])) r=j; if(fabs(a[r][i]) < EPS) continue; if(r != i) for(int j=0; j<=m; j++) swap(a[i][j],a[r][j]); for(int j=m; j>=i; j--) for(int k=i+1; k<n; k++) a[k][j] -= a[k][i]/a[i][i]*a[i][j]; } for(int i=n-1; i>=0; i--) { for(int j=i+1; j<n; j++) a[i][m] -= a[j][m]*a[i][j]; a[i][m] /= a[i][i]; } int res=0; for(int i=0; i<n; i++) for(int j=0; j<m; j++) if(fabs(a[i][j]-0) > EPS) { res++; break; } return res; } int main() { while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a)); for(int i=0; i<n; i++) for(int j=0; j<m; j++) scanf("%lf",&a[i][j]),a[i][m]=0; int ans=Gauss(); printf("%d\n",ans); } return 0; }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?