HDU 4341 Gold miner(分組揹包)

2022-05-28 04:45:12 字數 1165 閱讀 9702

題目鏈結 gold miner

目標是要在規定時間內獲得的價值總和要盡可能大。

我們先用並查集把斜率相同的物品分在同乙個組。

這些組裡的物品按照y座標的大小公升序排序。

如果組內的乙個物品被選取了,那該組排在他前面的所有物品肯定被選取了。

那麼我們對每個組的所有物品,對價值和代價分別求字首和。

那麼選了3號,就相當於選了1,2,3號。

這個時候問題就轉化為分組揹包了。

也就是說把物品轉換後,這個組內我最多只能選1個物品。

然後就很簡單了。

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

typedef long long ll;

const int n = 205;

struct node a[n];

int father[n], used[n], c[n], f[n], g[n], dp[n * n];

int n, t, cnt, et, ca = 0;

vector v[n];

int getfather(int x)

bool cmp(int p, int q)

int main()}}

} rep(i, 1, n) c[i] = getfather(i);

rep(i, 0, n + 1) v[i].clear();

cnt = 0;

memset(used, 0, sizeof used);

rep(i, 1, n)

else

} rep(i, 1, cnt) if ((int)v[i].size() > 1) sort(v[i].begin(), v[i].end(), cmp);

memset(dp, 0, sizeof dp);

rep(i, 1, cnt)

}} printf("case %d: %d\n", ++ca, dp[t]);

} return 0;

}

hdu4341 Gold miner 分組揹包dp

題意 和 礦工差不多。人在 0,0 有n種金,遊戲時間為t。告訴你每種金的位置 x,y 獲得該金需要的時間的t,以及它的 價值。且若人和多塊金子共線時,只能先取最近的金子。問在遊戲時間內可獲得最大價值。思路 對於共線的金,我們將其分為一組,並按照距 0,0 的距離排序,那麼選該點的價值為前面所有的價...

HDU 4341 Gold miner 分組揹包

這裡有多個點與原點的連線共線的話,那麼需要對其進行並組,將前乙個作為單獨的乙個,把前兩個作為單獨的乙個.最後直接分組揹包就可以了。如下 include include include include define maxn 205 using namespace std intn,m,cnt max...

HDU 4341 Gold miner 分組揹包

這裡有多個點與原點的連線共線的話,那麼需要對其進行並組,將前乙個作為單獨的乙個,把前兩個作為單獨的乙個.最後直接分組揹包就可以了。如下 include include include include define maxn 205 using namespace std intn,m,cnt max...