【bzoj4004】[JLOI2015]装备购买 贪心+高斯消元求线性基

题目描述

脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备。对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了。严格的定义是,如果脸哥买了 zi1,.....zip这 p 件装备,那么对于任意待决定的 zh,不存在 b1,....,bp 使得 b1zi1 + ... + bpzip = 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 了。脸哥想要在买下最多数量的装备的情况下花最少的钱,你能帮他算一下吗?

输入

第一行两个数 n;m。接下来 n 行,每行 m 个数,其中第 i 行描述装备 i 的各项属性值。接下来一行 n 个数,

其中 ci 表示购买第 i 件装备的花费。

输出

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

样例输入

3 3
1 2 3
3 4 5
2 3 4
1 1 2

样例输出

2 2



题解

贪心+高斯消元求线性基

bzoj2460 差不多,只是换成了一般向量的线性无关。

按照价格从小到大排序,优先挑选价格最低的进行消元,并把花费累加到答案中。

需要注意的一点是这道题卡精度,所以需要使用long double和eps=1e-6。

#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 510
using namespace std;
typedef long double ld;
const ld eps = 1e-6;
struct data
{
	ld v[N];
	int c;
}a[N];
bool vis[N];
bool cmp(data a , data b)
{
	return a.c < b.c;
}
int main()
{
	int n , m , i , j , k , t , tot = 0 , sum = 0;
	ld tmp;
	scanf("%d%d" , &n , &m);
	for(i = 1 ; i <= n ; i ++ )
		for(j = 1 ; j <= m ; j ++ )
			scanf("%Lf" , &a[i].v[j]);
	for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i].c);
	sort(a + 1 , a + n + 1 , cmp);
	for(i = 1 ; i <= m ; i ++ )
	{
		for(j = 1 ; j <= n ; j ++ )
			if(!vis[j] && fabs(a[j].v[i]) > eps)
				break;
		if(j > n) continue;
		tot ++ , sum += a[j].c , vis[j] = 1 , t = j;
		for(j = 1 ; j <= n ; j ++ )
			if(!vis[j])
				for(tmp = a[j].v[i] / a[t].v[i] , k = i ; k <= m ; k ++ )
					a[j].v[k] -= tmp * a[t].v[k];
	}
	printf("%d %d\n" , tot , sum);
	return 0;
}
时间: 2024-08-09 02:04:52

【bzoj4004】[JLOI2015]装备购买 贪心+高斯消元求线性基的相关文章

【bzoj2460】[BeiJing2011]元素 贪心+高斯消元求线性基

题目描述 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制过程中发现魔法矿石全部消失了,从而无法炼制出法杖,这个现象被称为“魔法抵消” .特别地,如果在炼制过程中使用超过一块同一种矿石,那么一定会发生“魔法抵消”. 后来,随着人们认知水平的提高,这个现象得到了很好的解释.经过了大量的实验后,著名法师 D

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

[BZOJ4004][JLOI2015]装备购买 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件

【bzoj4269】再见Xor 高斯消元求线性基

题目描述 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 输入 第一行一个正整数N. 接下来一行N个非负整数. 输出 一行,包含两个数,最大值和次大值. 样例输入 3 3 5 6 样例输出 6 5 题解 高斯消元求线性基裸题 由于线性基可以表示所有能够求出的异或和,所以我们只需要考虑线性基即可. 先求出线性基,然后按照从高位到低位的贪心思想来选择. 由于每个线性基的最高位在之前都没有出现过,所以每次选择一定会使答案增大,故直接

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

[JLOI2015]装备购买 \(solution:\) 首先这道题的题面已经非常清晰的告诉我们这就是线性空间高斯消元的一道题(可以用某些装备来表示另一件装备,这已经不能再明显了),只是这道题要求我们求出花费最小的方案,这个我们可以直接贪心,如果有多个装备可以匹配某一个属性,那么我们选价值最小的那一个(这个可以用线性空间的定义证明),价值大的尽量往后再选(选到最后剩下一些价格大的不买即可) \(code:\) #include<iostream> #include<cstdio>

【BZOJ2322】[BeiJing2011]梦想封印 高斯消元求线性基+DFS+set

[BZOJ2322][BeiJing2011]梦想封印 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantasy Seal)的特技,需要引入如下的概念: 每一位魔法的使用者都有一个“魔法脉络”,它决定了可以使用的魔法的种类. 一般地,一个“魔法脉络”可以看作一个无向图,有N个结点及M条边,将结点编号为1~N,其中有一个结点是特殊的,称为核心(Kernel),记作1号结点.每一条边有一个固有(即生成之后再也不

【BZOJ2844】albus就是要第一个出场 高斯消元求线性基

[BZOJ2844]albus就是要第一个出场 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2^S定义为S 所有子集构成的集合.定义映射 f : 2^S -> Zf(空集) = 0f(T) = XOR A[t] , 对于一切t属于T现在albus把2^S中每个集合的f值计算出来, 从小到大排成一行, 记为序列B(下标从1开始). 给定一个数, 那么这个数在序列B中第1次出现时的下标是多少呢? I

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关 每一位记录pivot[i]为i用到的行 枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出 如果最后异或成0了就说明线性相关... #include <iostream> #include &l

BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]

啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有交,异或后那块交就没了,相当于那块走了环上的路径: 如果环与路径没交,就是走到环上走一圈在回来,一去一回其他的地方又没了. 求一棵生成树,然后每一条非树边构成一个环,一共$m-n+1$个环 然后答案就是任取一些环的异或和与1到n路径异或和异或的最大值啦 实现上注意: 1.求生成树和简单环的异或和一遍

高斯消元求矩阵的逆

以前的博客:高斯消元,线性基,行列式. 考虑将\(A\)消成单位矩阵,同时对单位矩阵\(I\)做同样的操作,这样\(A\)变成\(I\),而\(I\)变成\(A^{-1}\). 用高斯消元即可. 若一列中全是0,说明该矩阵是奇异矩阵. 原文地址:https://www.cnblogs.com/utopia999/p/9763445.html