P3265 [JLOI2015]装备购买 线性无关组

2024-03-02 09:18

本文主要是介绍P3265 [JLOI2015]装备购买 线性无关组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:https://ac.nowcoder.com/acm/problem/20146
来源:牛客网
 

题目描述

脸哥最近在玩一款神奇的游戏,这个游戏里有 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 件装备的花费。

输出描述:

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

示例1

输入

复制

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

输出

复制

2 2

我们遇见的普通线性基(如模板题),都是在有关2进制与其异或和上用的

而这里用的是实数的线性基,在学实数的线性基之前,必须知道高斯消元的原理(因为我学线性基的时候没学高斯消元!!!)

那么我先讲一下为什么用高斯消元。

我们可以看到,如果物品aj可以用a1....aj-1组合而出的话,我们可以通过公式得到

k1*a1.x1+k2*a2.x1+k3*a3.x1+...+kj-1*aj-1.x1=aj.x1
k1*a1.x2+k2*a2.x2+k3*a3.x2+...+kj-1*aj-1.x2=aj.x2
......
k1*a1.xm+k2*a2.xm+k3.a3.xm+...+kj-1*aj-1.xm=aj.xm

我们就是要求出是否有这样的一组k使得上述等式成立

至于求解,我们可以用高斯消元。

但是由于这样做太过于麻烦,所以我们要结合线性基

假如我们将每个物品的属性看作向量,那么,我们要求的就是其中的一组基(如果一个物品可以通过其他的物品组合而成,那么它就不能是基的一部分)

我们上面的等式转化一下变成下面的

a1.x1,a1.x2,a1.x3...a1.xm ........1
a2.x1,a2.x2,a2.x3...a2.xm ........2
a3.x1,a3.x2,a3.x3...a3.xm ........3
...
aj.x1,aj.x2,aj.x3...aj.xm ........4

我们如果用高斯消元,用第一行的x1消去下面所有行的x1

然后用第二行剩下的x2(如果x2没有的话可以换一下行),然后把剩下的行的x2消去

.....

如果消到最后,剩下的j所有项为0,那么aj就可以不选了。

多么愉快的是用高斯消元就行了!

这里就不讲高斯消元了

如果在消过元后有一个位置不是0,那么它就可以作为第i位的基(可以这么说吗?)

贪心。先按照价值从小到大排序

pos[j]代表着    第  j   项的 基底  在 第  i  个式子里面

如果我们找到了一个基底

我们就break掉

下个方程碰到这个基底,把他后面的所有的都模上(减去)含有基底的那个方程

也就是消元的思想

此外,这道题还可能卡精度(不过我没卡),可能要再模上一个大质数取逆元,在整数区域内求解

#include<bits/stdc++.h>
using namespace std;
struct node{
double val[555];
int cost;
};
bool cmp(const node &a,const node &b)
{return a.cost<b.cost;
}
node p[555];
int pos[555];
double eps=1e-5;
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%lf",&p[i].val[j]);}}for(int i=0;i<n;i++){scanf("%d",&p[i].cost);}sort(p,p+n,cmp);memset(pos,-1,sizeof(pos));int num=0,f=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fabs(p[i].val[j])<=eps)continue;if(pos[j]==-1){pos[j]=i;num++;f+=p[i].cost;break;}else{double xs=p[i].val[j]/p[pos[j]].val[j];for(int k=j;k<m;k++){p[i].val[k]-=p[pos[j]].val[k]*xs;}}}}printf("%d %d\n",num,f);}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll val[555];
ll cost;
};
ll mod=1e9+7;
ll qpow(ll a,ll n)
{ll ans=1;while(n){if(n&1)ans=ans*a%mod;a=a*a%mod;n>>=1;}return ans;
}
bool cmp(const node &a,const node &b)
{return a.cost<b.cost;
}
node p[555];
ll pos[555];
double eps=1e-5;
int main()
{ll n,m;scanf("%lld%lld",&n,&m);for(ll i=0;i<n;i++){for(ll j=0;j<m;j++){scanf("%lld",&p[i].val[j]);}}for(ll i=0;i<n;i++){scanf("%lld",&p[i].cost);}sort(p,p+n,cmp);memset(pos,-1,sizeof(pos));ll num=0,f=0;for(ll i=0;i<n;i++){for(ll j=0;j<m;j++){if(fabs(p[i].val[j])<=eps)continue;if(pos[j]==-1){pos[j]=i;num++;f+=p[i].cost;break;}else{ll xs=p[i].val[j]*qpow(p[pos[j]].val[j],mod-2)%mod;for(ll k=j;k<m;k++){p[i].val[k]=(p[i].val[k]-p[pos[j]].val[k]*xs)%mod;}}}}printf("%lld %lld\n",num,f);}

 

这篇关于P3265 [JLOI2015]装备购买 线性无关组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765633

相关文章

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

带头结点的线性链表的基本操作

持续了好久,终于有了这篇博客,链表的操作需要借助图像模型进行反复学习,这里尽可能的整理并记录下自己的思考,以备后面复习,和大家分享。需要说明的是,我们从实际应用角度出发重新定义了线性表。 一. 定义 从上一篇文章可以看到,由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在某些实现的缺点,如求线性表的长度时不如顺序存储结构的

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

深度学习与大模型第3课:线性回归模型的构建与训练

文章目录 使用Python实现线性回归:从基础到scikit-learn1. 环境准备2. 数据准备和可视化3. 使用numpy实现线性回归4. 使用模型进行预测5. 可视化预测结果6. 使用scikit-learn实现线性回归7. 梯度下降法8. 随机梯度下降和小批量梯度下降9. 比较不同的梯度下降方法总结 使用Python实现线性回归:从基础到scikit-learn 线性

C#中的各种画刷, PathGradientBrush、线性渐变(LinearGradientBrush)和径向渐变的区别

在C#中,画刷(Brush)是用来填充图形(如形状或文本)内部区域的对象。在.NET框架中,画刷是System.Drawing命名空间的一部分,通常用于GDI+绘图操作。以下是一些常用的画刷类型: SolidBrush:用于创建单色填充的画刷。HatchBrush:用于创建具有图案填充的画刷。TextureBrush:用于创建具有图像纹理填充的画刷。LinearGradientBrush:用于创

《黑神话悟空》永冻流出装如何装备!!

整体玩法是通过法宝芭蕉扇打出控制后,再用化身技打出冰冻,冰冻期间用棍花持续输出,同时积攒元气和棍势,在利用三或四棍势打出一波爆发输出,基本上一套打完元气又满了,可以再放下一次控制,如此循环。低韧性的BOSS可以无限连到死,即使有时候没有存满元气,也可以用定身术弥补,容错率非常高。 在这里推荐一款专业的开放式耳机,南卡OE MIX作为一款百元开放式耳机最强者--0重力0压迫,全场景使用,生活和游戏

(感知机-Perceptron)—有监督学习方法、非概率模型、判别模型、线性模型、参数化模型、批量学习、核方法

定义 假设输入空间(特征空间)是 χ \chi χ ⊆ R n \subseteq R^n ⊆Rn,输出空间是y = { + 1 , − 1 } =\{+1,-1 \} ={+1,−1} 。输入 x ∈ χ x \in \chi x∈χ表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y ∈ y \in y∈y表示实例的类别。由输入空间到输出空间的如下函数: f ( x ) = s