日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ4004】装备购买(线性基)

發布時間:2025/6/17 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ4004】装备购买(线性基) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【BZOJ4004】裝備購買(線性基)

題面

BZOJ
洛谷

Description

臉哥最近在玩一款神奇的游戲,這個游戲里有 n 件裝備,每件裝備有 m 個屬性,用向量zi(aj ,.....,am) 表示
(1 <= i <= n; 1 <= j <= m),每個裝備需要花費 ci,現在臉哥想買一些裝備,但是臉哥很窮,所以總是盤算著
怎樣才能花盡量少的錢買盡量多的裝備。對于臉哥來說,如果一件裝備的屬性能用購買的其他裝備組合出(也就是
說臉哥可以利用手上的這些裝備組合出這件裝備的效果),那么這件裝備就沒有買的必要了。嚴格的定義是,如果
臉哥買了 zi1,.....zip這 p 件裝備,那么對于任意待決定的 zh,不存在 b1,....,bp 使得 b1zi1 + ... + bpzi
p = zh(b 是實數),那么臉哥就會買 zh,否則 zh 對臉哥就是無用的了,自然不必購買。舉個例子,z1 =(1; 2;
3);z2 =(3; 4; 5);zh =(2; 3; 4),b1 =1/2,b2 =1/2,就有 b1z1 + b2z2 = zh,那么如果臉哥買了 z1 和 z2
就不會再買 zh 了。臉哥想要在買下最多數量的裝備的情況下花最少的錢,你能幫他算一下嗎?

Input

第一行兩個數 n;m。接下來 n 行,每行 m 個數,其中第 i 行描述裝備 i 的各項屬性值。接下來一行 n 個數,
其中 ci 表示購買第 i 件裝備的花費。

Output

一行兩個數,第一個數表示能夠購買的最多裝備數量,第二個數表示在購買最多數量的裝備的情況下的最小花費

Sample Input

3 3

1 2 3

3 4 5

2 3 4

1 1 2

Sample Output

2 2

HINT

如題目中描述,選擇裝備 1 裝備 2,裝備 1 裝備 3,裝備 2 裝備 3 均可,但選擇裝備 1 和裝備 2 的花費最小,為 2。對于 100% 的數據, 1 <= n;m <= 500; 0 <= aj <= 1000。

題解

很有道理的線性基,完全沒有想到還有這種用法
其實回憶一下異或線性基的使用方法
我們可以理解為是在解一個異或方程組
方法是類似與高斯消元。
那么,這里不再是異或方程組,就是一個普通的方程組
那么,可以類似于異或線性基的做法
如果有當前系數的方程已經在線性基中存在
那么,把當前方程的每一項系數都按照對應的倍數減一下(這不就是高斯消元?)
然后繼續向后面的位置檢查就行了。
如果一個方程組可以被另外的方程組給表示出來
那么,它在線性基中一定無法插入進去(是不是很類似于把一個數丟進異或線性基,跑出來如果是\(0\)就可以被其他的數的異或和所表示)

考慮怎么求解,就和異或線性基一樣的套路啦,
按照價格從小到達排序,能夠插進去就插進去,
最后統計一下答案就好啦
本題卡精度

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define ll long long #define RG register #define MAX 555 #define double long double #define eps (1e-6) inline int read() {RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t; } bool vis[MAX]; double p[MAX][MAX]; int n,m; struct Node{int c;double p[MAX];}a[MAX]; bool operator<(Node a,Node b){return a.c<b.c;}; bool insert(int x) {for(int i=1;i<=m;++i){if(fabs(a[x].p[i])<=eps)continue;if(vis[i]){double b=a[x].p[i]/p[i][i];for(int j=i;j<=m;++j)a[x].p[j]-=p[i][j]*b;}else{vis[i]=true;for(int j=i;j<=m;++j)p[i][j]=a[x].p[j];return true;}}return false; } int main() {n=read();m=read();for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)a[i].p[j]=read();for(int i=1;i<=n;++i)a[i].c=read();sort(&a[1],&a[n+1]);int ans1=0,ans2=0;for(int i=1;i<=n;++i)if(insert(i))++ans1,ans2+=a[i].c;printf("%d %d\n",ans1,ans2);return 0; }

轉載于:https://www.cnblogs.com/cjyyb/p/8798189.html

總結

以上是生活随笔為你收集整理的【BZOJ4004】装备购买(线性基)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。