【bzoj4004】装备购买

Portal-->bzoj4004

Solution

  这题的话。。其实就是求\(n\)\(m\)维向量的极大线性无关组,并且要求权值最大

  然后套路什么的跟Portal-->bzoj3105和bzoj2460差不多,后面那题比较裸就没有写博了qwq

  与这两题不同的是,这里换成了向量的线性无关

  那其实写起来跟线性基差不多,本质上还是高斯消元,我们把一个向量看成矩阵中的一行,然后枚举去消这个向量的每一维,如果这个向量最终被消为零了那么就不能加进去作为基,否则的话就存在第一个没有被消为零的那一位中,与线性基不同的只是消的时候的运算变回了正常的高消方式而已

  然后就是加入的顺序,依旧还是按照价值排序然后直接贪心

  具体证明什么的还是要用到Portal-->拟阵

  我们将每个装备看成一个\(m\)维向量,将这\(n\)个向量的集合记为\(S\),如果\(S\)的一个子集\(R\)不存在任何一个非空子集存在满足题目中的替换条件的元素(也就是线性相关),那么\(R\in I\)

  然后就是证明这个东西是个拟阵:

  1、\(S\)肯定是有限集合

  2、遗传性:设\(A\in I\),由定义知\(A\)不存在任何一个非空子集存在满足替换的元素,所以对于任意\(B\subseteq A\),都有\(B\)满足这个性质(\(B\)的子集就是\(A\)的子集),所以\(B\in I\),所以\(I\)是遗传的

  3、交换性质:设\(A,B\in I\),且\(|B|>|A|\),要证明\(\exists x\in B-A\)使得\(A\cup \{x\}\in I\),反证一波:假设对于\(\forall x\in B-A\)均有\(A\cup \{x\}\notin I\),那么\(B-A\)中的包含的向量均可以写成\(A\)的某个子集中向量的线性表示,所以\(B\)中所有的向量都可以写成\(A\)的某个子集中向量的线性表示,然后这个与前面的\(|B|>|A|\)是矛盾的,所以假设不成立,得证

(然后就发现这个东西的证明怎么跟bzoj3105的几乎一喵一样。。。把异或和为\(0\)换成了线性表示而已。。)

  然后就可以给这个拟阵\(M\)关联一个权值函数\(w\),每个\(S\)中的向量对应的权值就是这件装备的价值,然后子集的权值就是包含向量的权值和

​  然后愉快贪心

(然后莫名其妙感觉自己写了两篇一喵一样的博。。。可能是错觉)

  哦对以及b站的数据加强了一波所以要用long long否则会炸精度出锅qwq

​  

  代码大概长这样

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ld long double
using namespace std;
const int MAXN=510;
const ld eps=1e-8;
struct Data{
	ld a[MAXN];
	int val;
	friend bool operator < (Data x,Data y)
	{return x.val<y.val;}
}a[MAXN];
int base[MAXN];
int n,m,ans,cnt;
void solve();

int main(){
#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
#endif
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;++i)
		for (int j=1;j<=m;++j)
			scanf("%Lf",&a[i].a[j]);
	for (int i=1;i<=n;++i)
		scanf("%d",&a[i].val);
	sort(a+1,a+1+n);
	solve();
	printf("%d %d\n",cnt,ans);
}

void solve(){
	ans=0; cnt=0;
	ld tmp;
	for (int i=1;i<=n;++i)
		for (int j=1;j<=m;++j){
			if (fabs(a[i].a[j])>eps){
				if (!base[j]){
					base[j]=i;
					++cnt; ans+=a[i].val;
					break;
				}
				else{
					tmp=a[i].a[j]/a[base[j]].a[j];
					for (int k=1;k<=m;++k)
						a[i].a[k]-=a[base[j]].a[k]*tmp;
				}
			}
		}
}
posted @ 2018-06-24 08:09  yoyoball  阅读(269)  评论(0编辑  收藏  举报