• P2455 [SDOI2006]线性方程组


    P2455 [SDOI2006]线性方程组

    (cdot)高斯消元模板题
    由于各种hack数据被造出来~码量突增~,其实也就多了二三十行
    将每行系数消到最多有一个非0数

    特殊情况:
    在过程同时
    没有这元了,则表示有无穷解
    发现一行系数都为0,但函数值不为0,则表示无解
    最后要注意的是,无穷解的前提是有解

    #include <iostream>
    #include <algorithm>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<vector>
    using namespace std;
    typedef long long LL;
    const double eps=1e-8;
    double xs[55][55],ans[55];
    int n,m,i,j,k;
    bool f1=0,f2=0;
    inline LL Read(){
    	LL x=0,f=1; char c=getchar();
    	while(c<'0'||c>'9'){
    		if(c=='-') f=-1; c=getchar();
    	}
    	while(c>='0'&&c<='9')
    		x=(x<<3)+(x<<1)+c-'0',c=getchar();
    	return x*f;
    }
    int main(){
        n=Read();
        for(LL i=1;i<=n;i++)
            for(LL j=1;j<=n+1;j++)
                xs[i][j]=(double)Read();
        LL c=1;
        for(LL i=1;i<=n;i++){
            if(c>n)//每个元都消过了 
    		    break;
    		for(LL j=i;j<=n;++j) 
                if (abs(xs[j][c])>abs(xs[i][c]))
                    for(LL k=1;k<=n+1;++k)
    				    swap(xs[i][k],xs[j][k]);
    				    
            if (fabs(xs[i][c])<eps){//没有该元 
                f2=1;//无穷解
                c++;
                i--;//这行消下一元
                continue;
            }
            for(LL j=i+1;j<=n;++j){
                double t=xs[j][c]/xs[i][c];
                for(LL k=c;k<=n+1;++k)
                    xs[j][k]-=xs[i][k]*t;
            }//消掉
            c++;
            
        }
        c=n; 
        for(LL i=n;i>=1;--i){
            if(c<1) 
    		    break;
            if(abs(xs[i][c])<eps)//没有该元
    		    continue;
            for(LL j=1;j<=i-1;++j){
                double t=xs[j][c]/xs[i][c];
                for(LL k=c;k<=n+1;++k)
                    xs[j][k]-=xs[i][k]*t;
            }//其他地方消掉 且不只是改变函数值
            c--;
        }
        for(LL i=n;i>=1;--i){
            f1=0;
            for(LL j=1;j<=n;++j)
    		    if(fabs(xs[i][j])>eps)
                    f1=1;
            if(f1==0&&fabs(xs[i][n+1])>eps){
                puts("-1");
                return 0;
            }//系数为0 函数值不为0
            if(fabs(xs[i][i])>eps) 
    		    if (!f2) 
    			    ans[i]=xs[i][n+1]/xs[i][i];
        }
        if (f2==1){
            puts("0");
            return 0;
        }
        
        for(LL i=1;i<=n;++i)
            if(fabs(ans[i])<eps) 
    		    printf("x%d=0
    ",i); 
    		else
    			printf("x%lld=%.2lf
    ",i,ans[i]);
        return 0;
    }
    
  • 相关阅读:
    移动端Rem布局注意事项
    手动添加kdump
    Linux 添加新磁盘,在线扩充空间
    virtualbox linux虚拟机相关
    CentOS7 重置root密码
    putty无密码登陆
    sublime text3 安装插件
    jsp常用代码
    jq鼠标移入移除
    ajax请求超时解决方案
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10214568.html
Copyright © 2020-2023  润新知