1. 程式人生 > >洛谷P3265 [JLOI2015]裝備購買(線性基)

洛谷P3265 [JLOI2015]裝備購買(線性基)

線性基 eps 線性 const mat problem nod nbsp www

傳送門

不難看出題目講的就是線性基

這種最小化權值的問題一般都是貪心的,就是按價值從低到高考慮每一個是否能選

據說貪心的證明得用擬陣我不會

據說這題是實數意義下的線性基我還是不會……

所以直接上代碼好了……

 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 }

洛谷P3265 [JLOI2015]裝備購買(線性基)