[JLOI2015]装备购买(线性基)
[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]装备购买(线性基)的更多相关文章
- BZOJ 4004 [JLOI2015]装备购买 | 线性基
题目链接 Luogu P3265 题解 非常正常的线性基! 但是我不会线性基-- (吐槽:#define double long double 才过--) #include <cstdio> ...
- BZOJ 4004 [JLOI2015]装备购买 ——线性基
[题目分析] 题目很简单,就是要维护一个实数域上的线性基. 仿照异或空间的线性基的方法,排序之后每次加入一个数即可. 卡精度,开long double 和 1e-6就轻松水过了. [代码] #incl ...
- bzoj4004 [JLOI2015]装备购买——线性基+贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4004 今天讲课讲到的题,据说满足拟阵的性质,所以贪心是正确的: 总之就贪心,按价格从小到大排 ...
- BZOJ_4004_[JLOI2015]装备购买_线性基
BZOJ_4004_[JLOI2015]装备购买_线性基 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) ...
- bzoj 4004 [JLOI2015]装备购买 拟阵+线性基
[JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 547[Submit][Status][Dis ...
- BZOJ 4004: [JLOI2015]装备购买
4004: [JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1154 Solved: 376[Submit][Statu ...
- 【BZOJ4004】[JLOI2015]装备购买 贪心+高斯消元
[BZOJ4004][JLOI2015]装备购买 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 ( ...
- bzoj 4004: [JLOI2015]装备购买 拟阵 && 高消
4004: [JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 337 Solved: 139[Submit][Status ...
- [JLOI2015]装备购买 (高斯消元)
[JLOI2015]装备购买 \(solution:\) 首先这道题的题面已经非常清晰的告诉我们这就是线性空间高斯消元的一道题(可以用某些装备来表示另一件装备,这已经不能再明显了),只是这道题要求我们 ...
随机推荐
- 【原创】RPM安装软件时解决依赖性问题(自动解决依赖型)
满足以下3个条件才能自动解决依赖性: 1.使用rpmdb -redhat(在安装时会自动弹出依赖性错误) 2.所有互相依赖的软件都必须在同一个目录下面. 3.调用-aid参数.
- PC比价软件
方法:从百度中搜索比较软件排行,并且根据将搜索时间缩小在一年内.统计前面一页结果网站中的比价软件. 名称 备注 统计 淘淘搜购物助手 淘宝购物比价神器 1 省省比价软件 主流网购商城进行横向比较的智能 ...
- 多任务-进程之Queue的进程间通信
1.经过线程和进程的对比,不难的知道,线程和进程有相当大的区别,如全局变量资源不能够共享. 2.在不同的进程间,如何实现通信呢? 需要提及的一个概念就是Queue,它是一个消息队列,下面通过一个例子来 ...
- webpack 操作
依赖安装 : 全局安装webpack : sudo npm install webpack -g 本地安装webpack : npm install webpack —save-dev 需要注意的 ...
- windows系统关闭端口占用进程
1.查找端口占用进程ID netstat -ano|findstr " 2.通过进程ID查找进程名 tasklist |findstr " 3.杀死进程(指定进程ID或进程名) t ...
- __weak修饰符
前言 在 HAL 库中,很多回调函数前面使用__weak 修饰符. weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”. 加上了__weak ...
- Myeclipse学习总结(7)——Eclipse插件之Maven配置及问题解析
前言: 今天在自己环境装了Maven环境, 并且安装了Eclipse插件, 在查找插件过程中确实遇到一些问题, 好不容易找到一个 却又有问题. 装好了插件之后, 用Eclipse创建Maven项目却 ...
- 时间就是金钱HNCOI2000(最短路)
时间就是金钱HNCOI2000 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 人们总是选时间最短或费用最低的路线 例如, ...
- 2、java注释、标识符、数据类型、类型转换
一.三种注释:单行注释.多行注释.文档注释(只能在类前或者方法前,@author作者) 二.java使用的编码为unicode码[0-65535] 包含ASCII码,在0-255中 ASCII码( ...
- PIC18F4520 + NRF24L01
SI SO应该对调过来用.. TX /* ** Tx.c ** Transmit test program for PIC18F4520 and nRF24L01 or nRF24L01+ ** Us ...