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

posted @ 2019-05-13 21:56  LuitaryiJack  阅读(132)  评论(0编辑  收藏  举报