洛谷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 }
深深地明白自己的弱小