UVALive 6449 IQ Test --高斯消元?
题意:给你一串数字,问这串数字符合f[n] = a*f[n-1],f[n] = a*f[n-1]+b*f[n-2],f[n] = a*f[n-1]+b*f[n-2]+c*f[n-3]这几个方程中的哪个,然后要你给出第n+1项,如果符合多个方程,项数小的优先(第一个方程优先)。
解法:这题我先处理看是否满足f[n] = a*f[n-1]的形式,如果不满足,则用高斯消元借出两项和三项的情况的a,b,c,比如第二个方程,f[3] = a*f[2]+b*f[1],f[4] = a*f[3]+b*f[2],两个方程两个未知量,用高斯消元解出a,b,这里可能不是整数,我将他们加了个0.5取下整,居然对了。后来看那场比赛没一个人是用的高斯消元,所以不知道这样是否正确,有看出来端倪的欢迎评论告诉我。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 4 int f[14]; typedef double Matrix[N][N]; int x,y,z; void gauss_elimination(Matrix A,int n) { int i,j,k,r; for(i=0;i<n;i++) { //选一行r并与i行交换 r = i; for(j=i+1;j<n;j++) if(fabs(A[j][i]) > fabs(A[r][i])) r = j; if(r != i) { for(j=0;j<=n;j++) swap(A[r][j],A[i][j]); } //与第i+1~n行进行消元 for(k=i+1;k<n;k++) { double f = A[k][i]/A[i][i]; //为了让A[k][i] = 0,第i行乘以的倍数 for(j=i;j<=n;j++) A[k][j] -= f*A[i][j]; } } //回代 for(i=n-1;i>=0;i--) { for(j=i+1;j<n;j++) A[i][n] -= A[j][n]*A[i][j]; A[i][n] /= A[i][i]; } x = (int)floor(A[0][n]+0.5); y = (int)floor(A[1][n]+0.5); if(n == 3) z = (int)floor(A[2][n]+0.5); } int main() { int t,n,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(f,0,sizeof(f)); for(i=1;i<=n;i++) scanf("%d",&f[i]); int ans = Mod; int a1,a2,a3; int flag; if((f[1] == 0 && f[2] == 0) || f[2]%f[1] == 0) { if(f[1] == 0 && f[2] == 0) a1 = 1; else a1 = f[2]/f[1]; flag = 1; for(i=3;i<=n;i++) { if(f[i] != a1*f[i-1]) flag = 0; } if(flag) ans = a1*f[n]; } if(ans != Mod) { printf("%d\n",ans); continue; } Matrix A; A[0][0] = A[1][1] = f[2]; A[0][1] = f[1]; A[1][0] = f[3]; A[0][2] = f[3]; A[1][2] = f[4]; gauss_elimination(A,2); flag = 1; for(i=3;i<=n;i++) { if(f[i] != x*f[i-1]+y*f[i-2]) flag = 0; } if(flag) ans = x*f[n]+y*f[n-1]; if(ans != Mod) { printf("%d\n",ans); continue; } A[0][0] = A[1][1] = A[2][2] = f[3]; A[0][1] = A[1][2] = f[2]; A[0][2] = f[1]; A[1][0] = A[2][1] = f[4]; A[2][0] = f[5]; A[0][3] = f[4]; A[1][3] = f[5]; A[2][3] = f[6]; gauss_elimination(A,3); //printf("%d %d %d\n",x,y,z); ans = x*f[n]+y*f[n-1]+z*f[n-2]; if(ans != Mod) printf("%d\n",ans); } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com