题意;

有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]装备购买(高斯消元+贪心,线性代数)的更多相关文章

  1. BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...

  2. BZOJ 4004: [JLOI2015]装备购买 高斯消元解线性基

    BZOJ严重卡精,要加 $long$  $double$ 才能过. 题意:求权和最小的极大线性无关组. 之前那个方法解的线性基都是基于二进制拆位的,这次不行,现在要求一个适用范围更广的方法. 考虑贪心 ...

  3. BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]

    和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #incl ...

  4. BZOJ 3143 高斯消元+贪心....

    思路: 先算一下每条边经过次数的期望 转化为每个点经过次数的期望 边的期望=端点的期望/度数 统计一下度数 然后高斯消元 贪心附边权--. //By SiriusRen #include <cm ...

  5. 洛谷P3265 [JLOI2015]装备购买(线性基+高斯消元)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 不难看出题目讲的就是线性基 这种最小化权值的问题一般都是贪心的,就是按价值从低到高考虑每一个是否能选 据说贪心的证明得用拟阵我不会 据说这题是实数意 ...

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

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

  7. [HNOI2013] 游走 - 概率期望,高斯消元,贪心

    假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...

  8. Luogu P3265 [JLOI2015]装备购买

    好吧刚开始不知道自己在写什么,,,后来写了线性方程组,又过了一天一上午终于明白了... 当然题意很显然:求代价最小的极大线性无关组. 那就高斯消元(好吧刚开始我不会用它来解这道题qwq) 第一个循环是 ...

  9. 【BZOJ 4004】 装备购买(高斯消元+贪心)

    装备购买 题目 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j ...

随机推荐

  1. 网络编程socket之一

    从今年10月22号开始我的python学习之路,一个月下来,磕磕碰碰,勉勉强强把基础部分算是学完了,一个月走过来,我过着别人看似单调,重复的生活,确实是,每天,每周都是一样的生活模式,早上7点40起床 ...

  2. Bootstrap-table 使用总结

    一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这 ...

  3. 使用WPF教你一步一步实现连连看(一)

    第一步: 问题,怎样动态的建立一个10*10的grid(布局) for (int i = 0; i < 10; i++) { RowDefinition rowDef = new RowDefi ...

  4. Abp中自定义Exception的HttpStatusCode

    Abp中在新版本中,抛出的异常(比如:UserFriendlyException)通过AjaxResponse封装后返回的时候,HttpStatusCode默认指定成了500. 对于一些默认封装好的处 ...

  5. Flash饼状图统计代码

    index.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  6. 2017-07-20 在Maven Central发布中文API的Java库

    知乎原链 相关问题: 哪些Java库有中文命名的API? 且记下随想. 之前没有发布过, 看了SO上的推荐:Publish a library to maven repositories 决定在son ...

  7. form的重置reset

    HTML中Form表单的reset方法被用来重置用户所输入的内容,以前一直误以为其是单纯的将input等输入项中的值清空. 但实际上不是这样的,reset方法的本质是将input等输入项中的内容还原为 ...

  8. JS性能优化 之 文档片段 createDocumentFragment

    我们用原生JS进行开发时,经常会用到两种更新DOM节点的方法:innerHTML 和 appendChild() .其中 innerHTML 会完全替换掉原先的节点内容,如果我们是想向元素追加子节点的 ...

  9. Spark jdbc postgresql数据库连接和写入操作源码解读

    概述:Spark postgresql jdbc 数据库连接和写入操作源码解读,详细记录了SparkSQL对数据库的操作,通过java程序,在本地开发和运行.整体为,Spark建立数据库连接,读取数据 ...

  10. retrofit框架接口调用时候报Throwing new exception

    最近在开发的时候遇到了一个很坑的问题,在三星6.0手机上请求接口时候报了一个异常:Throwing new exception 'length=1658; index=3248' with unexp ...