首页 > 其他 > 详细

Luogu P2455 [SDOI2006]线性方程组 高斯消元(伪)板子

时间:2019-05-13 22:24:30      阅读:117      评论:0      收藏:0      [点我收藏+]

果然如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

Luogu P2455 [SDOI2006]线性方程组 高斯消元(伪)板子

原文:https://www.cnblogs.com/Jackpei/p/10859309.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!