题目链接

看这道题之前,以为线性基只是支持异或的操作。。。

那么,我认为这道题体现出了线性基的本质:

就是说如何用最小的一个集合去表示所有出现的装备。

我们假设已经会使用线性基了,那么对于这道题该怎么办呢?

  • 显然,根据贪心的思想,我们先把这些装备按照 \(cost\) 也就是花费从小向大排序。
  • 我们从左往右 \(O(n)\) 扫一遍,如果可以插入线性基就插入然后加上答案的贡献。
  • 如果不能插入,就一定不会造成贡献,这一点是很显然的。

所以,现在的关键问题是如何构建线性基。

其实我认为并没有那么困难。

因为我们已经知道异或线性基的写法,实数线性基直接套一下就好了。

这里先给出异或线性基的代码:

for (int i = 62; i >= 0; i--){
if (!(x >> (int)i)) continue;
if (!p[i]) {
p[i] = x;
break;
}
x ^= p[i];
}

观察一下可以发现,其实就是看当前位是有为一,再看线性基数组有没有被占用。

最后再把当前的 \(1\) 变成 \(0\) 的这一个简单的过程。

其实,实数的线性基也是一样的。

只是考虑如何把第 \(i\) 位消掉的问题,那直接高斯消元就可以了。

消完之后当前位上的就变成 \(0\) 了捏。

Code

#include <bits/stdc++.h>

#define file(a) freopen(a".out", "r", stdin), freopen(a".out", "w", stdout)

#define Enter putchar('\n')
#define quad putchar(' ') const int N = 505;
const long double eps = 1e-6; int n, m, p[N]; struct Node {
long double a[N];
int cost;
friend bool operator<(const Node &p, const Node &q) {
return p.cost < q.cost;
}
} node[N]; signed main(void) {
// file("1458");
std::cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
std::cin >> node[i].a[j];
for (int i = 1; i <= n; i++)
std::cin >> node[i].cost;
std::sort(node + 1, node + 1 + n);
int ans1 = 0, ans2 = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (std::fabs(node[i].a[j]) < eps)
continue;
if (!p[j]) {
p[j] = i;
ans1 ++;
ans2 += node[i].cost;
break;
}
long double K = 1.0 * node[i].a[j] / node[p[j]].a[j];
for (int k = j; k <= m; k++)
node[i].a[k] -= K * node[p[j]].a[k];
}
}
std::cout << ans1 << " " << ans2 << std::endl;
}

[JLOI2015]装备购买 题解 / 实数线性基学习笔记的更多相关文章

  1. BZOJ4004:[JLOI2015]装备购买——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4004 https://www.luogu.org/problemnew/show/P3265 脸哥 ...

  2. ACM线性基学习笔记

    https://www.cnblogs.com/31415926535x/p/11260897.html 概述 最近的几场多校出现了好几次线性基的题目,,会想起之前在尝试西安区域赛的一道区间异或和最大 ...

  3. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...

  4. [JLOI2015]装备购买(线性基)

    [JLOI2015]装备购买 题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 nn 件装备,每件装备有 \(m\) 个属性,用向量 \(\mathbf{z_i}\)=\((a_1, \ldots ...

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

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

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

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

  7. 洛谷P3265 [JLOI2015]装备购买 [线性基]

    题目传送门 装备购买 格式难调,题面就不放了. 分析: 一句话,有$n$件物品,每件物品有$m$个属性和一个花费值,如果一个装备的属性值可以由其他装备的属性值改变系数后组合得到那就不买,求购买最多装备 ...

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

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

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

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

随机推荐

  1. DOM 对象的重点核心

    概述 :  文档对象模型(Document Object Model,简称DOM ),是W3C组织推荐的处理可扩展标记语言 (HTML或者XML)的标准编程接口. W3C已经定义了一系列的DOM接口, ...

  2. python源码方式安装后如何卸载

    可以重新源码安装,此时需要记录安装文件细节,可通过--record XX来记录,如: python setup.py install --record setup.log 这时所有的安装细节都写到lo ...

  3. django orm 更新数据时间不自动更新问题

    gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """ ...

  4. python学习-Day22

    目录 今日内容详细 hashlib加密模块 什么是加密 加密算法 加密的使用 基本使用 指定算法(md5) 将明文数据传递给算法对象 获取加密之后的密文数据 加密补充 加盐处理 动态加盐 加密应用场景 ...

  5. 打造一款高逼格的Vim神器

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 作者:枫上雾棋 链接:https://segmentfa ...

  6. 浅尝Spring注解开发_Servlet3.0与SpringMVC

    浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...

  7. Python 散列表查询_进入<哈希函数>为结界的世界

    1. 前言 哈希表或称为散列表,是一种常见的.使用频率非常高的数据存储方案. 哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行 API 定制,对于大部分高级语言而言,都会提供已经实现好 ...

  8. SecureCRT使用SSH链接出现Password Authentication Failed,Please verify that the username and password are correct的解决办法(亲测有效)

  9. hadoop联合hive基础使用

    sqoop路径:/opt/module/sqoop 把指定文件放到hadoop指定路径:hadoop fs -put stu1.txt /user/hive/warehouse/stu hive启动( ...

  10. Fail2ban 运维管理 服务控制

    启动监禁 启动所有或者单个监禁项目. # 语法:fail2ban-client start [监禁名称] root@ubuntu:~# fail2ban-client start sshd 停止监禁 ...