洛谷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 }

 

posted @ 2018-09-28 19:24  bztMinamoto  阅读(159)  评论(0编辑  收藏  举报
Live2D