正题
题目链接:https://www.luogu.com.cn/problem/P3265
题目大意
给出nnn个有权值的mmm元组。求最大独立集,即一个最大的集合且内部元素线性无关。且在集合最大的情况下权值和最小
通俗的说就是没有任何一个元素内被其他元素的倍数和表示。
解题思路
我们考虑线性基的本质就是拟阵的一个最大独立集,我们可以用线性基的方法来做。
也就是需要构造一个实数线性基。根据之前[BJWC2011]元素这道题的方法,我们知道我们可以根据权值从小到大加入直到无法加入为止。
考虑如何用拟阵证明这个贪心的最优性。设一个拟阵(S,L)(S,L)(S,L),定义TTT是最优集合,现在我们知道了一个AAA是TTT的子集,考虑证明加入一个目前权值最小的www有A∪{x}⊆TA\cup \{x\}\subseteq TA∪{x}⊆T。
证明
- 若A′=A∪{x}A'=A\cup\{x\}A′=A∪{x}且A′⊈TA'\nsubseteq TA′⊈T那么,先定义一个T′=A′T'=A'T′=A′若∣T′∣<∣T∣|T'|<|T|∣T′∣<∣T∣,根据拟阵的交换性则一定存在一个t∈Tt\in Tt∈T且t∉T′t\notin T't∈/T′且T′∪{x}∈LT'\cup\{x\}\in LT′∪{x}∈L。那么我们不停将xxx加入T′T'T′中直到∣T′∣=T|T'|=T∣T′∣=T那么此时有(T′−{w})∪{x}=T(T'-\{w\})\cup\{x\}=T(T′−{w})∪{x}=T。也就是val(T′)−val(w)+val(x)=val(T)val(T')-val(w)+val(x)=val(T)val(T′)−val(w)+val(x)=val(T)。
而又因为val(w)<val(x)val(w)<val(x)val(w)<val(x)所以val(T′)<val(T)val(T')<val(T)val(T′)<val(T),那么TTT就不是最优子集,所以不成立。
证毕
所以我们就这样从小到大加即可,时间复杂度O(nm2)O(nm^2)O(nm2)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=510;
const double eps=1e-5;
struct node{double x[N];int w;
}a[N];
int n,m,cnt,p[N],ans;
bool cmp(node x,node y)
{return x.w<y.w;}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%lf",&a[i].x[j]);for(int i=1;i<=n;i++)scanf("%d",&a[i].w);sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)if(fabs(a[i].x[j])>eps){if(!p[j]){p[j]=i;cnt++;ans+=a[i].w;break;}else{double rate=a[i].x[j]/a[p[j]].x[j];for(int k=j;k<=m;k++)a[i].x[k]-=a[p[j]].x[k]*rate;}}}printf("%d %d\n",cnt,ans);
}