time limit: 20 sec memory limit: 128 mb
submit: 2027 solved: 624
[submit][status][discuss]
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 31 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。
新加資料三組–2016.5.13
這道題可以看成求出最小權值的線性無關。因為要求線性無關,所以我們要用高斯消元,然後在當前列中貪心的選出乙個權值最小的進行消元,時間複雜度o(n*m*max(n,m))。精度是個玄學的東西。。洛谷上1e-5能過,bzoj試了一遍 都過不了,最後long double 強行水過。
#include
#include
#include
#define double long double
using
namespace
std;
const
int maxn = 520;
const
double eps = 1e-2;
double x[maxn][maxn];
int ans,n,m,w[maxn],cnt;
inline
void gauss()
if(r!=h)
for(register
int i=h+1;i<=n;i++)
if(fabs(x[i][l])>eps)
ans+=w[h];cnt++;
}}int main()
BZOJ4004 JLOI2015 裝備購買
臉哥最近在玩一款神奇的遊戲,這個遊戲裡有 n 件裝備,每件裝備有 m 個屬性,用向量zi aj am 表示 1 i n 1 j m 每個裝備需要花費 ci,現在臉哥想買一些裝備,但是臉哥很窮,所以總是盤算著 怎樣才能花盡量少的錢買盡量多的裝備。對於臉哥來說,如果一件裝備的屬效能用購買的其他裝備組合出...
BZOJ4004 JLOI2015 裝備購買
bzoj luogu 給你 n 個 m 維向量,每個向量有乙個權值,求最小權極大線性無關組。按照權值排序從小到大插入就好了。這樣很好證明 若存在一組向量線性相關,那麼肯定是刪掉權值最大的那個向量最優。那麼按權值從小到大插入時只要發現當前待插入向量與原向量集線性相關就不插入。怎麼維護向量集?類似線性基...
BZOJ 4004 JLOI2015 裝備購買
bzoj 4004 jloi2015 裝備購買 線性基 臉哥最近在玩一款神奇的遊戲,這個遊戲裡有 n 件裝備,每件裝備有 m 個屬性,用向量zi aj am 表示 1 i n 1 j m 每個裝備需要花費 ci,現在臉哥想買一些裝備,但是臉哥很窮,所以總是盤算著 怎樣才能花盡量少的錢買盡量多的裝備。...