版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ronaldo7_ZYB/article/details/89816938
题目描述
题解
根据线性空间的原理:若一个向量如果会被其他的向量表出,那么这个数在高斯消元里全为0.
那么我们只需要进行一个最单纯的高斯消元,每一次查找装备的时候基于贪心、找最小的即可。
注意这道题卡精度,要使用long double。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 550;
int n,m;
int c[N];
long double a[N][N];
int main(void)
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
int ans = 0,sum = 0;
cin>>n>>m;
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
cin>>a[i][j];
for (int i=1;i<=n;++i) cin>>c[i];
for (int i=1;i<=m;++i)
{
long double eps = 1e-8;
int Min = INT_MAX,r = 0;
for (int j=i;j<=n;++j)
if (fabs(a[j][i])>eps && c[j]<Min)
Min = c[j],r = j;
if (r == 0) break;
for (int j=1;j<=m;++j) swap(a[r][j],a[i][j]);
swap(c[i],c[r]);
sum ++;
ans += c[i];
for (int j=1;j<=n;++j)
{
if (i == j) continue;
long double rate = a[j][i]/a[i][i];
for (int k=i;k<=m;++k)
a[j][k] -= a[i][k]*rate;
}
}
cout<<sum<<' '<<ans<<endl;
return 0;
}