P3265-[JLOI2015]装备购买【线性基,拟阵贪心】
生活随笔
收集整理的這篇文章主要介紹了
P3265-[JLOI2015]装备购买【线性基,拟阵贪心】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接: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); }總結
以上是生活随笔為你收集整理的P3265-[JLOI2015]装备购买【线性基,拟阵贪心】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4000的台式电脑配置8成新能买多少(4
- 下一篇: P6178-[模板]Matrix-Tre