感觉线性代数的题都会和高斯消元挂钩,学习了一下用高斯消元解决线性基问题,证明跟前面一样都是拟阵,然后就很裸了,为了一个除号的问题看了半天。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define eps 1e-5
#define maxn 510
using namespace std;
struct yts
{
double b[maxn];
int val;
}a[maxn];
int n,ans,m,num;
int vis[maxn];
bool cmp(yts x,yts y)
{
return x.val<y.val;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%lf",&a[i].b[j]);
for (int i=1;i<=n;i++) scanf("%d",&a[i].val);
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (abs(a[i].b[j])>eps)
{
if (!vis[j])
{
vis[j]=i;
ans+=a[i].val;num++;
break;
}
else
{
double t=(double)a[i].b[j]/(double)a[vis[j]].b[j];
for (int k=j;k<=m;k++)
a[i].b[k]-=t*a[vis[j]].b[k];
}
}
printf("%d %d\n",num,ans);
return 0;
}