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

  

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long double ld;
const int N=505;
const ld EPS=1e-8;
int n,m;
ld lb[N][N];
struct Equip{
ld a[N];
int cost;
}s[N];
int use,sum;
inline bool cmp(const Equip &x,const Equip &y){return x.cost<y.cost;}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1,x;j<=m;j++) scanf("%llf",&s[i].a[j]);
for(int i=1;i<=n;i++) scanf("%d",&s[i].cost);
sort(s+1,s+1+n,cmp);
for(int x=1;x<=n;x++)
for(int i=1;i<=m;i++)
if(fabs(s[x].a[i])>=EPS){
if(fabs(lb[i][i])<EPS){
for(int j=i;j<=m;j++) lb[i][j]=s[x].a[j];
use++;
sum+=s[x].cost;
break;
}
for(int j=m;j>=i;j--)
s[x].a[j]-=lb[i][j]*(s[x].a[i]/lb[i][i]);
}
printf("%d %d\n",use,sum);
return 0;
}

【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. Windows ,获取硬盘物理序列号(VC++)

    #include <windows.h> BOOL GetHDID(PCHAR pIDBufer) {     HANDLE hDevice=NULL;    hDevice=::Crea ...

  2. 软件RAID

    软件RAID也必须在多磁盘系统中才能实现.实现RAID1最少要拥有两块硬盘,而实现RAID5则最少要拥有三块硬盘.通常情况下,操作系统所在磁盘采用RAID1,而数据所在磁盘采用RAID5.   卷的类 ...

  3. HTML和JS自解码机制

    1.HTML 如果用户的输入被嵌入到HTML代码中,会进行HTML解码 解码方式包括: 1.HTML实体编码: 假定下面onclick后面的内容是可控的 点击按钮 2.进制编码: 点击按钮 2.JS ...

  4. Shell 字符串处理、获取文件名和后缀名

    http://blog.csdn.net/guojin08/article/details/38704823

  5. linux简单命令常用随记

    //查看网络信息 ifconfig //修改ip地址 ifconfig eth0 123.123.123.123 netmask 255.255.255.0 //网关设置 route add defa ...

  6. kafka启动报错:另一个程序正在使用此文件,进程无法访问。

    在Windows上启动kafka_2.12-1.1.0报以下错误:[2018-05-08 10:24:51,777] ERROR Failed to clean up log for __consum ...

  7. java_web连接SQL_server详细步骤

    (1).我用的是Myeclipse,可以直接将sqljdbc4.jar拷到项目文件 (2).点开SQL Server配置管理器 选中SQL Server2008网络配置下的SQLEXPRESS的协议, ...

  8. Task 4 求数组的连续子数组的最大和(团队合作)

    小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...

  9. 【贪心算法】POJ-3190 区间问题

    一.题目 Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one wil ...

  10. 推荐一个Markdown数学公式编辑器——Haroopad & Mathjax

    要在Markdown里插入数学公式,如果没有好用的的引擎or编辑器,那么只能插入图片了,十分麻烦.这里推荐一个十分强大的数学公式引擎--Mathjax. 配置 有道云笔记目前不支持浏览MathJax公 ...