• 高斯消元


    高斯消元模板——cogs 721

    /*高斯消元求解线性方程组*/
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    using namespace std;
    #define N 100
    #define eps (1e-8)
    int n;double a[N][N];
    int main(){
        freopen("gaess.in", "r", stdin);
        freopen("gaess.out", "w", stdout);
        //freopen("cola.txt","r",stdin);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
        for(int i=1;i<=n;i++){
            int p=i;
            for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[p][i]))p=j;
            for(int j=1;j<=n+1;j++)swap(a[p][j],a[i][j]);
            if(fabs(a[i][i])<eps)continue;
            double tmp=a[i][i];
            for(int j=1;j<=n+1;j++)a[i][j]/=tmp;
            for(int j=1;j<=n;j++)
                if(i!=j){
                    double tmp=a[j][i];
                    for(int k=1;k<=n+1;k++)a[j][k]-=a[i][k]*tmp;
                }
        }
        int imp=0,ult=0;
        for(int i=1;i<=n;i++){
            int j=1;
            while(fabs(a[i][j])<eps&&j<=n+1)j++;
            if(j>n+1)ult=1;
            else if(j==n+1)imp=1;
        }
        if(imp){printf("-1");return 0;}
        if(ult){printf("0");return 0;}
        for(int i=1;i<=n;i++){
            if(fabs(a[i][n+1])<eps)printf("x%d=0
    ",i);
            else printf("x%d=%.2lf
    ",i,a[i][n+1]);
        }
    }

    bzoj1013

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define maxn 15
    using namespace std;
    int n;
    double pos[maxn][maxn],l[maxn][maxn];
    void guess(){
        for(int i=1;i<=n;i++){
            int t=i;
            for(int j=i+1;j<=n;j++)
                if(fabs(l[j][i])>fabs(l[t][i]))t=j;
            if(t!=i)for(int j=i;j<=n+1;j++)swap(l[i][j],l[t][j]);
            for(int j=i+1;j<=n;j++){
                double x=l[j][i]/l[i][i];
                for(int k=i;k<=n+1;k++)l[j][k]-=l[i][k]*x;
            }
        }
        for(int i=n;i>=1;i--){
            for(int j=i+1;j<=n;j++)l[i][n+1]-=l[j][n+1]*l[i][j];
            l[i][n+1]/=l[i][i];
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n+1;i++)
            for(int j=1;j<=n;j++){
                scanf("%lf",&pos[i][j]);
                if(i!=1){
                    l[i-1][j]=2*(pos[i][j]-pos[i-1][j]);
                    l[i-1][n+1]+=pos[i][j]*pos[i][j]-pos[i-1][j]*pos[i-1][j];
                }
            }
        guess();
        for(int i=1;i<=n;i++){
            printf("%.3lf",l[i][n+1]);
            if(i!=n)printf(" ");
        }
    }

    poj3185

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define INF 0x3fffffff
    #define maxn 20
    using namespace std;
    int a[22][22],x[22],free_n;
    int gcd(int a,int b){
        if(a<0)return gcd(-a,b);
        if(b<0)return gcd(a,-b);
        return b==0?a:gcd(b,a%b);
    }
    int guass(){
        int k,col=0;
        for(k=0;k<20&&col<20;k++,col++){
            int mx=k;
            for(int i=k+1;i<20;i++)
                if(a[i][col]>a[mx][col])mx=i;
            for(int i=k;i<21;i++)swap(a[k][i],a[mx][i]);
            if(!a[k][col]){k--;continue;}
            for(int i=k+1;i<20;i++){
                if(a[i][col]!=0){
                    int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][col];
                    int ta=lcm/a[i][col],tb=lcm/a[k][col];
                    if(a[i][col]*a[k][col]<0)tb=-tb;
                    for(int j=col;j<21;j++)
                        a[i][j]=((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2;
                }
            }
        }
        for(int i=0,j;i<20;i++){
            if(!a[i][i]){
                for(j=i+1;j<20;j++)
                    if(a[i][j])break;
                if(j==20)break;
                for(int r=0;r<20;r++)swap(a[r][i],a[r][j]);
            }
        }
        int mn=INF;
        for(int j=0;j<(1<<(20-k));j++){
            for(int i=0;i<(20-k);i++)
                if(j&(1<<i))x[20-1-i]=1;
                else x[20-1-i]=0;
            for(int i=k-1;i>=0;i--){
                int tmp=a[i][20]%2;
                for(int j=i+1;j<20;j++)
                    if(a[i][j])tmp=(tmp-a[i][j]*x[j]%2+2)%2;
                x[i]=(tmp/a[i][i])%2;
            }
            int tmp=0;
            for(int i=0;i<20;i++)tmp+=x[i];
            mn=min(mn,tmp);
            if(mn==0)break;
        }
        return mn;
    }
    int main(){
        freopen("Cola.txt","r",stdin);
        for(int i=0;i<20;i++){//枚举对每个数字进行操作 
            scanf("%d",&a[i][20]);
            a[i][i]=1;
            if(i>0)a[i-1][i]=1;
            if(i<19)a[i+1][i]=1;
        }
        printf("%d",guass());
    }

     poj2947

    /*
        求解同余方程组问题。 
        与一般求解线性方程组的问题类似,只要在求解过程中加入取余即可。
        注意:当方程组唯一解时,求解过程中要保证解在[3, 9]之间。
    */ 
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 310
    using namespace std;
    int n,m,a[maxn][maxn],ans[maxn];
    char str[8][10]={"S","MON","TUE","WED","THU","FRI","SAT","SUN"};
    char s1[10],s2[10];
    int guass(){
        int k=1,num=0;
        for(int i=1;i<=m&&k<=n;i++){//一共n个未知量 
            int p=m+1;
            for(int j=i;j<=m;j++)if(a[j][k]){p=j;break;}//可以用第j个工程求第k个零件,与高斯消元模板中取最大是一样的 
            if(p==m+1){k++;i--;continue;}//没有任何一个工程可以用来求第k个零件,那么求下一个零件 
            for(int j=1;j<=n+1;j++)swap(a[i][j],a[p][j]);//因为我们只需要阶梯状的部分,所以从k开始也无所谓 
            for(int j=i+1;j<=m;j++){
                if(!a[j][k])continue;
                int tmp=a[j][k];
                for(int l=k;l<=n+1;l++){//将下面各个方程的这一项化为0 
                    a[j][l]=a[i][l]*tmp-a[j][l]*a[i][k];//这里是为了保证所有数字都是整数 
                    a[j][l]=(a[j][l]%7+7)%7;
                }
            }
            num++;k++;
        }
        for(int i=num+1;i<=m;i++)if(a[i][n+1])return 0;//无解 
        if(num!=n)return 1;//多解 
        for(int i=n;i>=1;i--){
            for(int j=i+1;j<=n;j++){
                a[i][n+1]=a[i][n+1]-ans[j]*a[i][j];
                a[i][n+1]=(a[i][n+1]%7+7)%7;
            }
            ans[i]=0;
            for(int j=3;j<=9;j++){//枚举答案 
                if(a[i][i]*j%7==a[i][n+1])ans[i]=j;
            }
        }
        return 2;
    }
    int main(){
        freopen("Cola.txt","r",stdin);
        while(1){
            memset(a,0,sizeof(a));
            scanf("%d%d",&n,&m);
            if(n==0&&m==0)return 0;
            int k1,k2,x,num;
            for(int i=1;i<=m;i++){
                scanf("%d%s%s",&num,s1,s2);
                for(int j=1;j<=7;j++){
                    if(!strcmp(str[j],s1))k1=j;
                    if(!strcmp(str[j],s2))k2=j;
                }
                a[i][n+1]=(k2-k1+1+7)%7;
                for(int j=1;j<=num;j++){
                    scanf("%d",&x);
                    a[i][x]++;
                    if(a[i][x]>=7)a[i][x]-=7;
                }
            }
            k1=guass();
            if(k1==0)printf("Inconsistent data.
    ");
            else if(k1==1)printf("Multiple solutions.
    ");
            else{
                for(int i=1;i<=n;i++)printf("%d ",ans[i]);
                puts("");
            }
        }
    }
  • 相关阅读:
    Dingo/api 学习笔记
    Composer install 报错
    bootstrap4 调整元素之间距离
    css font-family常用的黑体宋体等字体中英文对照
    mac 开关机
    lodash.memoize
    Evevt Loop 事件循环
    mac 安装 XX-Net-3.12.11
    mac端口占用
    npm 安装/删除/发布/更新/撤销 发布包
  • 原文地址:https://www.cnblogs.com/thmyl/p/11144628.html
Copyright © 2020-2023  润新知