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 ...
随机推荐
- Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...
- [转]Angular——提示框
本文转自:https://blog.csdn.net/whm18322394724/article/details/80177950 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
- osgi.net框架简介
osgi.net是一个动态的模块化框架.它向用户提供了模块化与插件化.面向服务构架和模块扩展支持等功能.该平台是OSGi联盟定义的服务平台规范移植到.NET的实现. 简介 尤埃开放服务平台是一个基于. ...
- Jetbrains软件永久破解
说明:该破解到期时间为2099年,基本为永久破解! 1.点击右侧链接下载脚本JetbrainsCrack-3.1-release-enc.jar [JetbrainsCrack-release-enc ...
- 【协议】1、tcp,http,socket协议介绍
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- 8.并发容器ConcurrentHashMap#put方法解析
jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影.关于HashMap,通常也能说出它不是线程安全的.这篇文章要提到的是在多线程并发环境下的Ha ...
- html页面边框的另一种写法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- prototype、proto和constructor的三角关系
转载整理自http://www.cnblogs.com/xiaohuochai/p/5721552.html#3760057 http://blog.csdn.net/jasonzds/article ...
- java 多线程简单例子
实现线程的方式是一,继承Thread类,重写父类的run()方法 二,实现接口Runnable中的run()方法. 下面是简单的例子 例子1:银行存取钱问题 package com.direct.de ...
- ArcGIS Server生成文件的权限问题处理
[arcgisserver@gisserver3 usr]$ vi /arcgis/server/usr/init_user_param.sh