Description

  

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

  

(1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着

  

怎样才能花尽量少的钱买尽量多的装备。对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是

  

说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了。严格的定义是,如果

  

脸哥买了 zi1,.....zip这 p 件装备,那么对于任意待决定的 zh,不存在 b1,....,bp 使得 b1zi1 + ... + bpzi

  

p = zh(b 是实数),那么脸哥就会买 zh,否则 zh 对脸哥就是无用的了,自然不必购买。举个例子,z1 =(1; 2;

  

3);z2 =(3; 4; 5);zh =(2; 3; 4),b1 =1/2,b2 =1/2,就有 b1z1 + b2z2 = zh,那么如果脸哥买了 z1 和 z2

  

就不会再买 zh 了。脸哥想要在买下最多数量的装备的情况下花最少的钱,你能帮他算一下吗?

  

  

  

Input

  

  第一行两个数 n;m。接下来 n 行,每行 m 个数,其中第 i 行描述装备 i 的各项属性值。接下来一行 n 个数,

  

其中 ci 表示购买第 i 件装备的花费。

  

Output

  

  一行两个数,第一个数表示能够购买的最多装备数量,第二个数表示在购买最多数量的装备的情况下的最小花费

  

Sample Input

  

  3 3

  1 2 3

  3 4 5

  2 3 4

  1 1 2

  

Sample Output

  

  2 2

  

  

  

Solution

  

  还是有关那个带权线性基的问题,但是我还未膜拜拟阵证明,所以就先写着吧。

  

  我们发现,这个新物品购买与否的判定机制,是看用已购买的物品能否线性表示出新物品。这不就是线性基的那一套插入、判定能否线性表示的做法吗?

  

  再考虑到那个贪心的方法——我们要使选中的物品价值尽可能小,那么依照套路我们按物品价值从小到大依次考虑,尝试加入线性基:能,那就买;中途消成0,就说明它可以被线性表示,不买。

  

  这题的实现不再能直接套用异或线性基的写法了,而是要用实数来模拟线性基。记线性基的向量为\(b_1,b_2,...,b_m\),其实每一个\(b_i\)类比于异或线性基中的每一个数,只不过异或线性基还把向量状压了。线性基用矩阵表示就长这样:

\[\begin{bmatrix}
b_{m,1}&b_{m,2} &b_{m,3} &... &b_{m,m}\\
...&...&...&...&...\\
b_{3,1}&b_{3,2} &b_{3,3} &... &b_{3,m}\\
b_{2,1}&b_{2,2} &b_{2,3} &... &b_{2,m}\\
b_{1,1}&b_{1,2} &b_{1,3} &... &b_{1,m}\\
\end{bmatrix}
\]

​  尝试加入一个向量\(a=[a_1,a_2,...,a_m]\)时,我们从\(b_m\)开始,一行一行地循环到\(b_1\)。考虑\(b_i\)时,如果\(a_i=0\),continue;如果\(b_{i,i}=0\),我们把整个\(b_i\)赋值为\(a\);如果\(b_{i,i}\ne0\),我们用\(b_i\)消去\(a_{i,i}\),继续往下走。类比异或线性基的插入方法,就能很好地理解普通线性基的插入方法。

  

  由于BZOJ新加了三组毒瘤数据,因此实数要用long double保证精度。

  

   

  

Code

  

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. using namespace std;
  5. typedef long double ld;
  6. const int N=505;
  7. const ld EPS=1e-8;
  8. int n,m;
  9. ld lb[N][N];
  10. struct Equip{
  11. ld a[N];
  12. int cost;
  13. }s[N];
  14. int use,sum;
  15. inline bool cmp(const Equip &x,const Equip &y){return x.cost<y.cost;}
  16. int main(){
  17. scanf("%d%d",&n,&m);
  18. for(int i=1;i<=n;i++)
  19. for(int j=1,x;j<=m;j++) scanf("%llf",&s[i].a[j]);
  20. for(int i=1;i<=n;i++) scanf("%d",&s[i].cost);
  21. sort(s+1,s+1+n,cmp);
  22. for(int x=1;x<=n;x++)
  23. for(int i=1;i<=m;i++)
  24. if(fabs(s[x].a[i])>=EPS){
  25. if(fabs(lb[i][i])<EPS){
  26. for(int j=i;j<=m;j++) lb[i][j]=s[x].a[j];
  27. use++;
  28. sum+=s[x].cost;
  29. break;
  30. }
  31. for(int j=m;j>=i;j--)
  32. s[x].a[j]-=lb[i][j]*(s[x].a[i]/lb[i][i]);
  33. }
  34. printf("%d %d\n",use,sum);
  35. return 0;
  36. }

【BZOJ4004】【JLOI2015】装备购买的更多相关文章

  1. 【题解】 bzoj4004: [JLOI2015]装备购买 (线性基)

    bzoj4004,戳我戳我 Solution: 裸的线性基,这没啥好说的,我们说说有意思的地方(就是我老是wa的地方) Attention: 这题在\(luogu\),上貌似不卡精度,\(bzoj\) ...

  2. [BZOJ4004][JLOI2015]装备购买(贪心+线性基)

    求最小权极大线性无关组. 先将所有向量按权值排序,从小到大依次判断,若能被前面已选向量线性表出则不选,这样一定最优. 据说是用拟阵来证明,但感性理解一下感觉比较显然,首先这样个数一定是最多的,其次对于 ...

  3. bzoj4004 [JLOI2015]装备购买——线性基+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4004 今天讲课讲到的题,据说满足拟阵的性质,所以贪心是正确的: 总之就贪心,按价格从小到大排 ...

  4. BZOJ4004: [JLOI2015]装备购买

    总之就是线性基那一套贪心理论直接做就好了. 然而加强数据后很卡精度的样子. 于是重点在于这个特技:在整数模意义下搞. #include<cstdio> #include<algori ...

  5. BZOJ4004 [JLOI2015]装备购买[贪心+线性基+高消]

    一个物品可以被其他物品表出,说明另外的每个物品看成矩阵的一个行向量可以表出该物品代表的行向量. 于是构造矩阵,求最多选多少个物品,就是尽可能用已有的物品去表示,相当于去消去一些没必要物品, 类似于xo ...

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

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

  7. bzoj 4004: [JLOI2015]装备购买 拟阵 && 高消

    4004: [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 337  Solved: 139[Submit][Status ...

  8. BZOJ_4004_[JLOI2015]装备购买_线性基

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

  9. [JLOI2015]装备购买 (高斯消元)

    [JLOI2015]装备购买 \(solution:\) 首先这道题的题面已经非常清晰的告诉我们这就是线性空间高斯消元的一道题(可以用某些装备来表示另一件装备,这已经不能再明显了),只是这道题要求我们 ...

  10. BZOJ 4004: [JLOI2015]装备购买

    4004: [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1154  Solved: 376[Submit][Statu ...

随机推荐

  1. Eclipse web项目更改项目名称

    1. 右键工程:Refactor->Rename,更改项目名称: 2. 修改项目目录下:.project文件 <?xml version="1.0" encoding= ...

  2. CHAPTER 24 History of Our Planet 第24章 我们行星的历史

    CHAPTER 24 History of Our Planet 第24章 我们行星的历史 Uncovering the bones of ancient beasts is only part of ...

  3. UVa 10055

    说一下犯错的地方: 1)没有注意数据范围,题目中是The input numbers are not greater than balabalabala. 而这个32位的int类型恰好装不下2^32, ...

  4. 工程能力之C4模型

    概述 刚在InfoQ上看到一篇介绍C4Model的文章,觉得这个模型设计的很赞,很有指导意义,做个简单的记录. Why,为什么需要架构图? ThoughtWorks中国 文章中有几句话我觉得很有道理, ...

  5. caffe 预训练 或者Fine-Tuning 操作

    1.使用预训练模型,需要修改训练的prototxt,将layer name改为与要使用模型的layer name相同即可. Borrowing Weights from a Pretrained Ne ...

  6. Django_用户权限管理rbac

    组成部分 1.初始化权限:login视图initial_permission,把权限信息放入session.initial_permission函数生成权限列表.菜单列表 2.中间件验证权限:在第一次 ...

  7. learning of a previous team

     作为一个软件工程团队,离不开下面三个要素:支持,即分享.责任和合作. 分享是出色技术团队的另一个关键要素,它是团队的基石之一.只有通过分享,团队才有可能实现1+1 > 2这种效应,分享也是让团 ...

  8. Dailu Scrum (2015/10/27)

    在周日晚上PM已经为大家分配了部分的代码修改工作,今天晚上PM召集了被分配代码工作的3个DEV一起讨论要求修改的代码.在共同讨论的过程中确有发现以下代码的不规范之处,PM当即要求我们先要修改规范代码的 ...

  9. 2017-2018-2 『Java程序设计』课程 结对编程练习_四则运算

    相关测试过程截图(JUnit) JudgeTest:对计算及将整数化为分数的测试 SuffixExpressionTest:中缀转后缀的测试 RationalNumberTest:对RationalN ...

  10. Shell脚本 数据清洗

    需要做的任务是将上图类似的格式的文件进行处理,将年月日小时分别提取出来放到每行的行尾(上图已清洗好) 自己的思路是先用cut命令将每行的年月日小时提取出来,分别给一个变量,然后再循环利用sed命令将年 ...