Luogu P2455 [SDOI2006]线性方程组 真•高斯消元板子

果然如Miracle学长所说。。。调了一天。。。qwq。。还是过不了线下的Hack

upd after 40min:刚刚过了


 

就是多了一个判无解的操作。。。

当系数都为0,且常数项不为0时,即为无解。

当找到自由元时,不能跳过这一行。。。否则会被Hack,见洛谷讨论

#include<cstdio>
#include<iostream>
#include<cmath>
#define R register int
using namespace std;
const double eps=1E-6;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
long double a[55][55];
int n,m,k;
inline bool ck0(double x) {return x<eps&&x>-eps;}
inline void Gauss() {
    for(R i=1,pos=1;i<=n&&pos<=n;++i) { R p;
        for(p=pos;p<=n&&ck0(a[p][i]);++p) ;
        if(p==n+1) continue;
        if(pos!=p) for(R j=1;j<=n+1;++j) swap(a[pos][j],a[p][j]);
        for(R j=pos+1;j<=n;++j) if(!ck0(a[j][i])){
            register long double t=a[j][i]/a[pos][i];
            for(R k=1;k<=n+1;++k) a[j][k]-=a[pos][k]*t;
        } ++pos;
    } register bool flg1=false,flg2=false;
    for(R i=1;i<=n;++i) { R j=1;
        while(ck0(a[i][j])&&j<=n+1) ++j;
        if(j==n+1) flg1=true;
        if(j>n+1) flg2=true;
    } if(flg1) {putchar('-'),putchar('1'); return ;}
    if(flg2) {putchar('0'); return ;}
    for(R i=n;i>=1;--i) {
        for(R j=n;j>=i+1;--j) a[i][n+1]-=a[i][j]*a[j][n+1];
        a[i][n+1]/=a[i][i];
    } for(R i=1;i<=n;++i) if(ck0(a[i][n+1])) printf("x%d=0\n",i); else printf("x%d=%.2Lf\n",i,a[i][n+1]);
}
signed main() {
    n=g(); for(R i=1;i<=n;++i) for(R j=1;j<=n+1;++j) a[i][j]=g(); Gauss(); //while(1);
}

2019.05.13

转载于:https://www.cnblogs.com/Jackpei/p/10859309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值