description
臉哥最近在玩一款神奇的遊戲,這個遊戲裡有
n 件裝備,每件裝備有
m個屬性,用向量zi
(aj,
....
.,am
) 表示(1
≤i≤n
;1≤j
≤m) ,每個裝備需要花費ci
,現在臉哥想買一些裝備,但是臉哥很窮,所以總是盤算著怎樣才能花盡量少的錢買盡量多的裝備。對於臉哥來說,如果一件裝備的屬效能用購買的其他裝備組合出(也就是說臉哥可以利用手上的這些裝備組合出這件裝備的效果),那麼這件裝備就沒有買的必要了。嚴格的定義是,如果臉哥買了zi
1,..
...z
ip這p
件裝備,那麼對於任意待決定的zh
,不存在b1
,...
.,bp
使得b1
zi1+
...+
bpzi
p=zh
(b是實數),那麼臉哥就會買zh
,否則z
h 對臉哥就是無用的了,自然不必購買。舉個例子,z1
=(1;
2;3)
;z2=
(3;4
;5);
zh=(
2;3;
4),b
1=1/
2,b2
=1/2
,就有b1
z1+b
2z2=
zh,那麼如果臉哥買了 z1
和z2 就不會再買zh
了。臉哥想要在買下最多數量的裝備的情況下花最少的錢,你能幫他算一下嗎?
input
第一行兩個數n;
m 。接下來
n 行,每行
m個數,其中第
i 行描述裝備
i 的各項屬性值。接下來一行
n個數,其中 ci
表示購買第
i 件裝備的花費。(1
≤n;m
≤500;0
≤aj≤
1000)
output
一行兩個數,第乙個數表示能夠購買的最多裝備數量,第二個數表示在購買最多數量的裝備的情況下的最小花費
sample input
3 31 2 3
3 4 5
2 3 4
1 1 2
sample output
2 2solution
把所有裝備按價值從小到大排序後找線性基即可,貪心證明需用到擬陣
code
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
typedef
long
double ld;
typedef pairp;
const
int inf=0x3f3f3f3f,maxn=505;
#define eps 1e-5
int sign(ld x)
struct node
else
}printf("%d %d\n",num,cost);
return
0;}
bzoj 4004 裝備購買(線性基)
反思 犯了乙個錯誤,學了高斯消元後想在高斯消元的過程中得到解,但在高斯消元的過程中貪心並不是正解,似乎會影響到後面的決策使得總花費不是最優。這題要用線性基,線性基求基的過程是列舉每乙個向量,看這個向量能加到哪一行,如果當前行向量已存在那麼對這個向量進行初等變換使得向量該位置為0,這樣會保證線性基的每...
BZOJ4004 JLOI2015 裝備購買
臉哥最近在玩一款神奇的遊戲,這個遊戲裡有 n 件裝備,每件裝備有 m 個屬性,用向量zi aj am 表示 1 i n 1 j m 每個裝備需要花費 ci,現在臉哥想買一些裝備,但是臉哥很窮,所以總是盤算著 怎樣才能花盡量少的錢買盡量多的裝備。對於臉哥來說,如果一件裝備的屬效能用購買的其他裝備組合出...
BZOJ 4004 JLOI2015 裝備購買
time limit 20 sec memory limit 128 mb submit 2027 solved 624 submit status discuss description 臉哥最近在玩一款神奇的遊戲,這個遊戲裡有 n 件裝備,每件裝備有 m 個屬性,用向量zi aj am 表示 1...