• 【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;
    				}
    			}
    		}
    }
    
  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/yoyoball/p/9219563.html
Copyright © 2020-2023  润新知