线性空间:是由一组基底构成的所有可以组成的向量空间
  对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩  
  并且这i个主元线性无关

  1. /*
  2. 每个向量有权值,求最小权极大线性无关组
  3.  
  4. 本题是使用贪心策略的高斯消元
  5. 由输入给出的n个物品,每个物品有m种属性,和价格price
  6. 如果a物品的属性可以由其他已有物品的属性组合出,那么a可以不必购买
  7. 问最少花掉多少钱,使得所有物品都可以组合出
  8. 首先构建n*m矩阵,然后高斯消元
  9. 在求第i个主元时,取价格最小的那个即可
  10. 可用反证法证明
  11. */
  12. #include<bits/stdc++.h>
  13. using namespace std;
  14. #define maxn 1005
  15. #define ld long double
  16. #define esp 1e-6
  17. struct Vec{//带权向量
  18. ld a[maxn];
  19. int w;
  20. bool operator<(const Vec & x)const {
  21. return w<x.w;
  22. }
  23. }p[maxn];
  24. int n,m;
  25.  
  26. int main(){
  27. cin>>n>>m;
  28. for(int i=;i<=n;i++)
  29. for(int j=;j<=m;j++)
  30. cin>>p[i].a[j];
  31. for(int i=;i<=n;i++)scanf("%d",&p[i].w);
  32. sort(p+,p++n);//按权值从小到大排即可
  33. int ans=,cnt=;
  34. //高斯消元!
  35. int i=,j=,Max,Maxw;
  36. for(;i<=n && j<=m;i++,j++){
  37. Max=i;
  38. if(fabs(p[Max].a[j])>esp)//这里一定要加fabs,因为可能会有赋值
  39. Maxw=p[Max].w;
  40. else Maxw=;
  41.  
  42. for(int k=i+;k<=n;k++)
  43. if(fabs(p[k].a[j])>esp && p[k].w<Maxw){Max=k;Maxw=p[k].w;}
  44. if(fabs(p[Max].a[j])<esp){i--;continue;}
  45.  
  46. ans+=Maxw;cnt++;
  47. if(Max!=i)//把Max换到第i行
  48. swap(p[i],p[Max]);
  49.  
  50. for(int k=;k<=n;k++)//把每行的第j个数消为0
  51. if(k!=i){
  52. ld r=(ld)p[k].a[j]/p[i].a[j];
  53. for(int t=;t<=m;t++)
  54. p[k].a[t]-=r*p[i].a[t];
  55. p[k].a[j]=;
  56. }
  57. }
  58.  
  59. printf("%d %d\n",cnt,ans);
  60. }

网上找到一中贼快的高斯消元写法。。以后就用它了

思路是枚举矩阵上的每个元素,对于每个非0的A[i][j],如果A[i][j]可以作为主元,那么就把F[j](即第j列上的主元)标记为i,因为剩下的位如何已经不重要了,所以直接退出本轮循环,继续下一行

若A[i][j]不可以作主元,说明第j列已经有主元了,那么就用那个主元所在的行F[j]来消A[i][j]

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cmath>
  6. using namespace std;
  7. #define double long double
  8. const double eps=1e-;
  9. struct str
  10. {
  11. double a[];
  12. int v;
  13. bool operator < (const str &s) const
  14. {
  15. return v<s.v;
  16. }
  17. }a[];
  18. int n,m,f[];
  19. int main()
  20. {
  21. int i,j,k,ans1=,ans2=;
  22. double x;
  23. cin>>n>>m;
  24. for (i=;i<=n;i++)
  25. for (j=;j<=m;j++)
  26. cin>>a[i].a[j];
  27. for (i=;i<=n;i++)
  28. cin>>a[i].v;
  29. sort(a+,a+n+);
  30. for (i=;i<=n;i++)
  31. for (j=;j<=m;j++)
  32. if (fabs(a[i].a[j])>eps)
  33. {
  34. if (!f[j])//如果第j列还没有被作为秩,并且第i行第j列非0
  35. {
  36. f[j]=i;
  37. ans1++;
  38. ans2+=a[i].v;
  39. break;
  40. }
  41. else//反之就用A[f[j]][j]来消去A[i][j]
  42. {
  43. x=a[i].a[j]/a[f[j]].a[j];
  44. for (k=j;k<=m;k++)
  45. a[i].a[k]-=a[f[j]].a[k]*x;
  46. }
  47. }
  48. cout<<ans1<<" "<<ans2<<endl;
  49. }

线性空间和异或空间(线性基)bzoj4004贪心+高斯消元优秀模板的更多相关文章

  1. 【bzoj4004】[JLOI2015]装备购买 贪心+高斯消元求线性基

    题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j < ...

  2. 【BZOJ4004】[JLOI2015]装备购买 贪心+高斯消元

    [BZOJ4004][JLOI2015]装备购买 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 ( ...

  3. 【BZOJ2460】[BeiJing2011]元素 贪心+高斯消元求线性基

    [BZOJ2460][BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法 ...

  4. [hdu 3949]线性基+高斯消元

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 一开始给做出来的线性基wa了很久,最后加了一步高斯消元就过了. 之所以可以这样做,证明如下. 首 ...

  5. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  6. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...

  7. 【XSY2701】异或图 线性基 容斥原理

    题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个 ...

  8. 【bzoj4004】【JLOI2015】装备购买 (线性基+高斯消元)

    Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 < ...

  9. bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 异或两次同一段路径的权值,就相当于没有走这段路径: 由此可以得到启发,对于不同的走法, ...

随机推荐

  1. JMeter(三)遇到的问题01: 通过CSV Data Set Config参数化有中文时,显示为?

    当使用CSV Data Set Config进行参数化,内容中含有中文时,响应文本显示为? 解决办法:只需要将“file encoding”设置为“gb2312”就可以了.

  2. L - Tic-Tac-Toe FZU - 2283 (思维)

    题目链接: L - Tic-Tac-Toe FZU - 2283 题目大意:两个人下棋,一共是三步棋,第一个人下一步,第二个人下一步,第三个人下一步,然后问你在两个人在都足够聪明的条件下,第一个人能否 ...

  3. python selenium+phantomJS自动化测试环境

    0x00配置phantomJS 1. 在windows平台下 此种方法是弹浏览器进行自动化测试的. 1.下载谷歌的驱动 https://chromedriver.storage.googleapis. ...

  4. Microsoft SQL - 指令

    exec指令 查询数据库详细状态 exec sp_helpdb 数据库名称 修改数据库名称 exec sp_rename oldname,new_name 查看表状态 exec sp_help 表名称 ...

  5. C++ operator(重载操作符) 【转】

    转自:http://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html operator是C++的关键字,它和运算符一起使用,表 ...

  6. Xilinx原语学习之时钟资源相关原语

    一直来,都是使用Vivado中自带的GMIItoRGMII IP核来完成GMII转RGMII的功能:尽管对GMII及RGMII协议都有一定的了解,但从没用代码实现过其功能.由于使用IP时,会涉及到MD ...

  7. Git学习笔记03-工作区和暂存区

    Git和其他版本控制工具不同的地方就是有暂存区的概念 工作区(Working Directory) 就是在电脑界面上能够看到的目录 版本库(Repository) 工作区下面有个一个.git文件夹,也 ...

  8. 一个优秀windows C++ 程序员该有哪些知识

  9. u3d发送邮件

    http://gad.qq.com/article/detail/22810 https://www.douban.com/note/655356118/ http://gad.qq.com/arti ...

  10. android studio 学习之一 安装和基本使用

    一.简介 Android Studio 是一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开 ...