[JLOI2015]装备购买

题目描述

脸哥最近在玩一款神奇的游戏,这个游戏里有 nn 件装备,每件装备有 \(m\) 个属性,用向量 \(\mathbf{z_i}\)=\((a_1, \ldots ,a_j, \ldots , a_m)\) 表示 \(1 \leq i \leq n\), \(1 \leq j \leq m\),每个装备需要花费 \(c_i\) ,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备。对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了。

严格的定义是,如果脸哥买了 \(\mathbf{z_{i_1}}\), \(\ldots\) , \(\mathbf{z_{i_p}}\) 这 \(p\) 件装备,那么对于任意待决定的 \(\mathbf{z_h}\)​ ,不存在 \(b_1\), \(\ldots ,b_p\) 使得 \(b_1\mathbf{z_{i_1}} + \ldots + b_p\mathbf{z_{i_p}} = \mathbf{z_h}\) ​​ ( \(b_i\)​ 均是实数),那么脸哥就会买 \(\mathbf{z_h}\)​ ,否则 \(\mathbf{z_h}\)​ 对脸哥就是无用的了,自然不必购买。

举个例子, \(\mathbf{z_1}=(1, 2, 3), \ \mathbf{z_2}=(3, 4, 5), \ \mathbf{z_h}=(2, 3, 4)\), \(\ b_1 =\frac{1}{2}, \ b_2 =\frac{1}{2}\),就有 \(b_1\mathbf{z_1} + b_2\mathbf{z_2} = \mathbf{z_h}\) ,那么如果脸哥买了 \(\mathbf{z_1}\)​ 和 \(\mathbf{z_2}\)​ 就不会再买 \(\mathbf{z_h}\) 了。

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

输入输出格式

输入格式:

第一行两个数 n,m。接下来 n 行,每行 m 个数,其中第 i 行描述装备 i 的各项属性值。接下来一行 n 个数,其中 \(c_i\) 表示购买第 i 件装备的花费。

输出格式:

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

输入输出样例

输入样例#1: 复制

3 3

1 2 3

3 4 5

2 3 4

1 1 2

输出样例#1: 复制

2 2

说明

如题目中描述,选择装备 1 装备 2,装备 1 装备 3,装备 2 装备 3 均可,但选择装备 1 和装备 2 的花费最小,为 2。

对于 100% 的数据, 1 <= n;m <= 500; 0 <= aj <= 1000。


题解

这是一道线性基的原理题。咕咕咕

线性基的思想是由向量来表示的。

也就是说:

存在\(b_1\), \(\ldots ,b_p\) 使得 \(b_1\mathbf{z_{i_1}} + \ldots + b_p\mathbf{z_{i_p}} = \mathbf{z_h}\) ​​ ( \(b_i\)​ 均是实数)

就像物理里面的力的分解一样。

多个不同方向和不同或相同大小的力可以构成另外一个合力。

其实异或只是线性基的另一种oi思想。

我们把向量的每一维看做二进制。只是这里的二进制是一个实数而不只是01序列。那么我们就用高斯消元的思想,不断的把从1到n维度的实数用之前的数去消掉。这样的话,就得到了一个类似而二进制的最高位1的数组的最高位下标就是最高位维度的数组。

是不是就和线性基一样了?

再加一个贪心维护让小价值的拼出大价值的就好了。


代码


#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const double eps=1e-5;
int p[1001],n,m,ans,sum;
struct node{
int vi;
double x[1001];
}a[1001]; bool cmp(node a,node b){
return a.vi<b.vi;
} void solve()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(fabs(a[i].x[j])>eps){
if(!p[j]){
p[j]=i;
sum++;
ans+=a[i].vi;
break;
}
else {
double t=(double)(1.0*a[i].x[j])/(1.0*a[p[j]].x[j]);
for(int k=j;k<=m;k++){
a[i].x[k]-=t*(a[p[j]].x[k]);
}
}
}
}
}
printf("%d %d",sum,ans);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&a[i].x[j]);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].vi);
sort(a+1,a+n+1,cmp);
solve();
return 0;
}

[JLOI2015]装备购买(线性基)的更多相关文章

  1. BZOJ 4004 [JLOI2015]装备购买 | 线性基

    题目链接 Luogu P3265 题解 非常正常的线性基! 但是我不会线性基-- (吐槽:#define double long double 才过--) #include <cstdio> ...

  2. BZOJ 4004 [JLOI2015]装备购买 ——线性基

    [题目分析] 题目很简单,就是要维护一个实数域上的线性基. 仿照异或空间的线性基的方法,排序之后每次加入一个数即可. 卡精度,开long double 和 1e-6就轻松水过了. [代码] #incl ...

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

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

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

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

  5. bzoj 4004 [JLOI2015]装备购买 拟阵+线性基

    [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 547[Submit][Status][Dis ...

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

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

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

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

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

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

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

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

随机推荐

  1. Andoid CustomCircleProgress 半圆

    package com.play.playgame.view; import android.content.Context; import android.graphics.Canvas; impo ...

  2. [转帖]关于Xilinx下Micro_Blaze中UartLite232外设的使用

    来源:https://blog.csdn.net/shen_you/article/details/78713746

  3. HDU 1171 Big Event in HDU【01背包】

    题意:给出n个物品的价值和数目,将这一堆物品分给A,B,问怎样分使得两者的价值最接近,且A的要多于B 第一次做的时候,没有思路---@_@ 因为需要A,B两者最后的价值尽可能接近,那么就可以将背包的容 ...

  4. CSS3新增的属性有哪些:

    CSS 用于控制网页的样式和布局. CSS3 是最新的 CSS 标准. CSS3新增了很多的属性,下面一起来分析一下新增的一些属性: 1.CSS3边框: border-radius:CSS3圆角边框. ...

  5. 解决Windows下git需要每次都要ssh-add的问题

    顽皮的很: 不知道怎么回事,每次打开git提交代码都需要ssh-add一下秘钥才可以正常提交: 不然就报错权限之类的问题: 怎么才能更方便一些? 卸了重装!我没试... 再或者是在 git 的安装目录 ...

  6. 列表的初识,列表的索引切片,列表的增删改查,列表的嵌套,元组的初识,range

    1 内容总览 列表的初识 列表的索引切片 列表的增删改查 列表的嵌套 元组的初识(了解) 元组的简单应用(了解) range 2 具体内容 列表的初识 why: str: 存储少量的数据.切片出来全都 ...

  7. NOIp2018模拟赛四十三

    有了昨天的经验,不慌,开题先看source ******** 再看看题,看到C题标题: ******** 有毒... B题的“显然”50分结论推了我一个小时,然后就弃疗了... 成绩:0+50+5=5 ...

  8. 用TamperMonkey去掉cdsn中的广告

    最近CSDN需要登录后才能查看更多内容,有点影响心情 解决方案 添加一段书签 javascript:(function(){document.getElementById('article_conte ...

  9. luogu P4018 Roy&October之取石子(博弈论)

    题意 题解 如果n是6的倍数,先手必败,否则先手必胜. 因为6*x一定不是pk 所以取得话会变成6*y+a的形式a=1,2,3,4,5: 然后a一定为质数.我们把a取完就又成为了6*x的形式. 又因为 ...

  10. BZOJ 5254 [Fjwc2018]红绿灯 (线段树)

    题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...