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

本文深入探讨了线性基概念,并通过一个具体问题展示了如何运用贪心算法进行最优选择。文章提供了详细的代码实现,包括数据输入、排序、线性基构建及最终结果输出,适合对线性代数和算法优化感兴趣的读者。

传送门

 

 

不知道线性基是什么东西的可以看看蒟蒻的总结

不难看出题目讲的就是线性基

这种最小化权值的问题一般都是贪心的,就是按价值从低到高考虑每一个是否能选

据说贪心的证明得用拟阵我不会

据说这题是实数意义下的线性基我还是不会……据说得用高斯消元……

所以直接上代码好了……

 1 //minamoto
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define N 505
 6 #define eps 1e-6
 7 #define double long double
 8 #define ll long long
 9 using namespace std;
10 struct node{
11     int cost;double b[N];
12     inline bool operator <(const node &b)const
13     {return cost<b.cost;}
14 }a[N];
15 int cnt,sum,p[N],n,m;
16 int main(){
17     scanf("%d%d",&n,&m);
18     for(int i=1;i<=n;++i)
19     for(int j=1;j<=m;++j)
20     scanf("%Lf",&a[i].b[j]);
21     for(int i=1;i<=n;++i) scanf("%d",&a[i].cost);
22     sort(a+1,a+1+n);
23     for(int i=1;i<=n;++i)
24     for(int j=1;j<=m;++j)
25     if(fabs(a[i].b[j])>eps){
26         if(!p[j]){p[j]=i,++cnt,sum+=a[i].cost;break;}
27         double t=a[i].b[j]/a[p[j]].b[j];
28         for(int k=j;k<=m;++k)
29         a[i].b[k]-=a[p[j]].b[k]*t;
30     }
31     printf("%d %d\n",cnt,sum);
32     return 0;
33 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9720420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值