高斯消元,90pts WA on #9/#12/#13 求调,玄关
查看原帖
高斯消元,90pts WA on #9/#12/#13 求调,玄关
1690315
DPOI楼主2025/8/3 20:16

如题,目前是这个帖子给的 hack 全过。

#include<bits/stdc++.h>
using namespace std;
double a[55][55];
const double eps=1e-8;
int n;

int guess(){
    int rk=0;
    for(int i=1;i<=n;++i){
        int r=i;
        for(int k=i;k<=n;++k){
            if(fabs(a[k][i])>eps){
                r=k;
                break;
            }
        }
        if(r!=i)swap(a[i],a[r]);
        if(fabs(a[i][i])<eps)continue;
        rk++;
        for(int j=n+1;j>=i;--j)a[i][j]/=a[i][i];
        for(int k=i+1;k<=n;++k){
            for(int j=n+1;j>=i;--j)a[k][j]-=a[i][j]*a[k][i];
        }
    }
    for(int i=1;i<=n;++i){
        bool flag=1;
        for(int j=1;j<=n;++j)if(fabs(a[i][j])>eps)flag=0;
        if(flag&&fabs(a[i][n+1])>eps)return -1;
    }
    if(rk<n)return 0;
    for(int i=n-1;i>=1;--i){
        for(int j=i+1;j<=n;++j)a[i][n+1]-=a[i][j]*a[j][n+1];
    }
    return 1;
}

int main(){
    cin>>n;
    for(int i=1;i<=n;++i)for(int j=1;j<=n+1;++j)cin>>a[i][j];
    int res=guess();
    if(res==-1)cout<<-1;
    else if(res==0)cout<<0;
    else for(int i=1;i<=n;++i)cout<<"x"<<i<<"="<<fixed<<setprecision(2)<<a[i][n+1]<<"\n";
}
2025/8/3 20:16
加载中...