zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",x,y,z);
            ans = x*f[n]+y*f[n-1]+z*f[n-2];
            if(ans != Mod)
                printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    大数据基础——MR编程应用——对中间件的操作
    Hadoop_Hive整理——原理及配置
    Hadoop&Hive——小结
    mysql_小结之事务
    Linux_大数据与数据仓库
    移动布局小结
    JDBC——小结
    Mysql优化反刍
    NoSql-Verson1.0
    python-6
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3896083.html
Copyright © 2011-2022 走看看