[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. java高级——暴力反射

    反射,java中一个比较高级的应用,主要和开发中的框架紧密相连.今天我们就介绍一下他的特性之一,暴力反射.(听名字很恐怖呦) package wo; public class A{ public St ...

  2. python中index、slice与slice assignment用法

    python中index.slice与slice assignment用法 一.index与slice的定义: index用于枚举list中的元素(Indexes enumerate the elem ...

  3. windows 路由

    route ? 查看帮助 route print 查看路由表 添加一条路由: route add 10.10.10.0 mask 255.255.255.0  192.168.1.1 #到达10.10 ...

  4. redis数据库服务器开启的三种方式

    redis的启动方式1.直接启动  进入redis根目录,执行命令:  #加上‘&’号使redis以后台程序方式运行 1 ./redis-server & 2.通过指定配置文件启动  ...

  5. [luogu] P2787 语文1(chin1)- 理理思维(分块)

    P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...

  6. 洛谷 P1524 十字绣

    P1524 十字绣 题目背景 考古学家发现了一块布,布上做有针线活,叫做“十字绣”,即交替地在布的两面穿线. 题目描述 布是一个n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面.每一段线都覆 ...

  7. asp.net C# 获取网页源代码的几种方式

    1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text ...

  8. G4Studio+extjs+highcharts 下在ext4j的panel中放入hightCharts图表

    在G4Studio+extjs下.创建一个panel,然后将highCharts图表放入panel中.实现方法例如以下: 首先简单给出的部分代码: Ext.onReady(function() { v ...

  9. [Angular] Create a ng-true-value and ng-false-value in Angular by controlValueAccessor

    If you're coming from AngularJS (v1.x) you probably remember the ng-true-value and ng-false-value di ...

  10. 赵雅智:android教学大纲

    带下划线为详细内容链接地址.点击后可跳转.希望给大家尽一些微薄之力.眼下还在整理中 教学章节 教学内容 学时安排 备注 1 Android高速入门 2 Android模拟器与常见命令 3 Androi ...