P3265 [JLOI2015]装备购买(高斯消元+贪心,线性代数)
题意;
有n个装备,每个装备有m个属性,每件装备的价值为cost。
小哥,为了省钱,如果第j个装备的属性可以由其他准备组合而来。比如
每个装备属性表示为, b1, b2.......bm . 它可以由其他2个装备组合而成,则
b1=k1*a1+h1*c1. b2=k1*a2+h2*c1.......bm=km*am+hm*cm这样的话,把属性看做是向量,是不是相当于2个m维度的向量,线性的表示了第三个向量呢?
那么,题目的意思就是在n个向量中,找出一组基,并且这一组基的价值和最小。
这相当于把这些向量先放进一个矩阵中,这里出现了一个问题,那就是这些向量是按什么样的顺序放的。其实,我们是按价值从小到大依次从上向下放。至于为什么,后面会讲。
当这样一个矩阵构造好了之后,我们回到原问题。我们求在n个向量中,找出一组基,并且这一组基的价值和最小。
那么这一组基其实就是矩阵的极大无关组。而求极大无关组,直接运用高斯消元就行了。但是在这个题中我们需要改变一般高斯消元中主元的选择(一般高斯消元一般选择某一列中最大值(不懂的自己查一下代码))
我们的主元是这样的,枚举从1到m的列,第一个不为0的所在行作为主元。 可能不太明白,我举个例子
这样,先枚举[1][1]=0; 枚举下一个[1][2]!=0 则,列2的主元就是第一行了,并把它记录在p[2]=1中,后面跳出,枚举第2行
[2][1]!=0则,p[1]=2;跳出, 枚举第3行,因为第1列的主元已经有了,然后第2行把第3行进行消元。完成后,枚举到第2列,然以用第2列的主元第1行,消第3行的元,然后依次类推。那么最后的个数和代价就是基的个数和基的价值。为什么这样?你是不是已经发现,选择的主元肯定是第一,第二前面的行。我们刚刚放入向量的价值从上到下是从小到大的,这样就是一个贪心。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 505
const long double eps = 1e-;
struct node
{
long double x[maxn];
int cost;
}a[maxn];
int n, m, p[maxn], cnt;
int sum;
bool cmp(node a, node b){
return a.cost < b.cost;
}
void guass()
{
for (int i = ; i <= n;++i)
for (int j = ; j <= m; ++j)
{
if (abs(a[i].x[j])>eps) //当矩阵【i】【j】>0时,
{
if (!p[j])
{
p[j] = i;
cnt++; sum += a[i].cost;
break;
}
else
{
long double t = a[i].x[j] / a[p[j]].x[j];
for (int k = j; k <= m; ++k)
a[i].x[k] -= a[p[j]].x[k] * t;
}
}
}
}
int main()
{
cin >> n >> m;
for (int i = ; i <= n;++i)
for (int j = ; j <= m; ++j)
cin >> a[i].x[j];
for (int i = ; i <= n; ++i)
cin >> a[i].cost;
sort(a + , a + n+, cmp);
guass();
//printf("%d %d\n", cnt, sum);
cout << cnt << " " << sum << endl;
}
代码
P3265 [JLOI2015]装备购买(高斯消元+贪心,线性代数)的更多相关文章
- BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...
- BZOJ 4004: [JLOI2015]装备购买 高斯消元解线性基
BZOJ严重卡精,要加 $long$ $double$ 才能过. 题意:求权和最小的极大线性无关组. 之前那个方法解的线性基都是基于二进制拆位的,这次不行,现在要求一个适用范围更广的方法. 考虑贪心 ...
- BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]
和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #incl ...
- BZOJ 3143 高斯消元+贪心....
思路: 先算一下每条边经过次数的期望 转化为每个点经过次数的期望 边的期望=端点的期望/度数 统计一下度数 然后高斯消元 贪心附边权--. //By SiriusRen #include <cm ...
- 洛谷P3265 [JLOI2015]装备购买(线性基+高斯消元)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 不难看出题目讲的就是线性基 这种最小化权值的问题一般都是贪心的,就是按价值从低到高考虑每一个是否能选 据说贪心的证明得用拟阵我不会 据说这题是实数意 ...
- 洛谷P3265 [JLOI2015]装备购买 [线性基]
题目传送门 装备购买 格式难调,题面就不放了. 分析: 一句话,有$n$件物品,每件物品有$m$个属性和一个花费值,如果一个装备的属性值可以由其他装备的属性值改变系数后组合得到那就不买,求购买最多装备 ...
- [HNOI2013] 游走 - 概率期望,高斯消元,贪心
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...
- Luogu P3265 [JLOI2015]装备购买
好吧刚开始不知道自己在写什么,,,后来写了线性方程组,又过了一天一上午终于明白了... 当然题意很显然:求代价最小的极大线性无关组. 那就高斯消元(好吧刚开始我不会用它来解这道题qwq) 第一个循环是 ...
- 【BZOJ 4004】 装备购买(高斯消元+贪心)
装备购买 题目 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j ...
随机推荐
- 自动化运维(1)之二进制部署MySQL5.7
二进制部署MySQL5.7 这个文档用于基础解释,后面通过ansible的自动化对MySQL单实例进行安装部署. 1.解压文件 # tar zxvf mysql-5.7.22-linux-glibc2 ...
- 数据分析之pandas模块
一.Series 类似于一位数组的对象,第一个参数为数据,第二个参数为索引(索引可以不指定,就默认用隐式索引) Series(data=np.random.randint(1,50,(10,))) S ...
- 运行 svgatest 显示 mmap /dev/zero Permission denied 解决办法
答案是我在这个网站上找到的: 执行 xset dpms force off 命令就可以解决掉这个问题. 再次运行 svgatest 程序,得到了预期的结果,perfect!
- Modbus通信协议 【 初识 Modbus】
Modbus协议 Modbus 协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络(例如以太网)和其它设备之间可以通信.它已经成为一通用工业标准.有了它,不同厂 ...
- Java框架之Struts2(六)
一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为E ...
- MEF 插件式开发之 小试牛刀
MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发人员得 ...
- 通过AccessKey调用阿里云CDN接口刷新CDN资源案例
通过AccessKey远程调用阿里云CDN接口,快速实现自动化集成部署. CdnService.java package com.nfky.cdn; import com.aliyuncs.Defau ...
- Python 练习:使用 * 输出直角三角形
正方向 height = int(input("please input height: ")) tmp = 1 while tmp <= height: width = t ...
- 聊聊HTTP gzip压缩与常见的Android网络框架
版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/5835990.html 进入主题之前,我们先来看一下客户端与服 ...
- 表单元素的required,autocomplete,list用法
required: 当在一个表单元素如:input中加上required属性时,点击提交表单按钮,针对input会弹出一个默认的警告信息,如下图: 代码如下: <form id="my ...