• 【bzoj4004】装备购买


    Portal-->bzoj4004

    Solution

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

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

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

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

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

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

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

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

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

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

      3、交换性质:设(A,Bin I),且(|B|>|A|),要证明(exists xin B-A)使得(Acup {x}in I),反证一波:假设对于(forall xin B-A)均有(Acup {x} otin 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
    ",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;
    				}
    			}
    		}
    }
    
  • 相关阅读:
    zimg
    ffmpeg P016 P010 YUV444P16LE 的打印的像素值
    zimg 使用
    P010LE P016LE YUV420P10LE
    如鹏网学习笔记(八)CSS
    对dui界面 组件 hook的通杀方案
    Python 中str 与 bytes 数据结构转换
    Tensorflow 老版本的安装
    Java string和各种格式互转 string转int int转string
    电脑黑屏
  • 原文地址:https://www.cnblogs.com/yoyoball/p/9219563.html
Copyright © 2020-2023  润新知