『高斯消元』装备购买(线性空间+贪心)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/Ronaldo7_ZYB/article/details/89816938