d −牛
半仙的魔
塔d-牛半仙的魔塔
d−牛半仙的
魔塔牛半仙的妹子被大魔王抓走了,牛半仙為了就他的妹子,前往攻打魔塔。
魔塔為一棵樹,牛半仙初始在一號點。
牛半仙有攻擊,防禦,血量三個屬性。
除一號點外每個點都有魔物防守,魔物也有攻擊,防禦,血量三個屬性。
每個怪物後面都守著一些藍寶石,獲得1藍寶石可增加1防。
牛半仙具有突襲屬性,所以遇到魔物後會率先發動攻擊,然後牛半仙和魔物輪換地攻擊對方。
乙個角色被攻擊一次減少的血量是對方的攻擊減去自己的防禦。
當乙個角色的血量小於等於 0 時,他就會死亡。
當牛半仙第一次到達某個節點時會與這個節點的魔物發生戰鬥。
當乙個魔物死亡後,這個魔物所在的節點就不會再產生新的魔物。
現在牛半仙想知道他打死魔塔的所有魔物後的最大血量。
第一行乙個 n 代表節點數。
隨後 n-1 行,每行兩個數 i,j,表示 i 與 j 節點有邊相連。
隨後一行,三個數,依次為勇士的血量、攻擊、防禦。
隨後 n-1 行,每行四個數,依次為怪物的血量、攻擊、防禦,和其守著的藍寶石數量。
乙個數,代表最大血量。如果牛半仙在打死魔塔的所有魔物之前就已經死亡了,則輸出 -1。
6
1 21 3
1 44 5
5 650000 10 0
35 54 2 4
25 55 3 5
21 51 4 5
20 64 5 3
43 64 6 1
48901
打怪的順序依次為4,3,5,2,6
可以證明不存在更優的方案。
對於20%的資料:n≤15
又有30%的資料:n≤1000,且保證對於每一條邊 (i,j),一定滿足 i=1
對於前90%的資料:n≤1000,且保證對於每一條邊(i,j),一定滿足 j=i+1 或 i=1
對於最後10%的資料:n≤100000,且保證對於每一條邊(i,j),一定滿足 j=i+1 或 i=1
對於100%的資料:有牛半仙血量<5*10^18,攻擊=2000,盔甲防禦=0。
怪物血量為3000~10^6 攻擊5 * 10^5- 7 * 10^5
防禦≤1000,打完乙隻怪後獲得的藍寶石數量為1至5
因為牛半仙攻擊一定,那麼打乙隻怪的次數是不變的
那麼我們考慮攻打點的先後順序
設價效比為打這只
怪獲得的
藍寶石數
量攻打一
只怪所需
次數
\frac
攻打乙隻怪所
需次數打
這只怪獲
得的藍寶
石數量
然後我們用乙個並查集,如果當前點的父親節點價效比比它兒子小,就並成乙個點
然後我們從1號點出發,每次將可以到達的點加入大根堆維護就好了
考場上沒想到這種做法, 只想到了價效比,但是沒有想到大根堆還有並查集,痛失不知道多少分,血虧
#include
#include
#include
#include
#include
#define ll long long
using
namespace std;
priority_queue < pair <
double
,int
>
> q;
int n, h[
100001
], fa[
100001
], fath[
100001
], x, t;
ll hp[
100001
], ad[
100001
], def[
100001
], num[
100001
], tim[
100001];
bool vis[
100001];
struct node w[
200001];
void
add(
int x,
int y)
; h[x]
= t;
w[++t]
=(node)
; h[y]
= t;
}void
dfs(
int now,
int fath)
}int
find
(int now)
//尋找鋇鋇【誤
intmain()
fath[1]
=1;scanf
("%lld%lld%lld"
,&hp[1]
,&ad[1]
,&def[1]
);//牛半仙的血量攻擊防禦
for(
int i =
2; i <= n;
++i)
dfs(1,
0); vis[1]
=1;while
(!q.
empty()
)printf
("%lld"
, hp[1]
);}
並查集 牛客1080 B
tokitsukaze有n個數,需要按順序把他們插入雜湊表中,雜湊表的位置為0到n 1。插入的規則是 剛開始雜湊表是空的。對於乙個數x,在雜湊表中,如果 x mod n 的位置是空的,就把x放在 x mod n 的位置上。如果不是空的,就從 x mod n 往右開始找到第乙個空的位置插入。若一直到n...
牛客練習賽16C 任意點 並查集
平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數n表示點數 1 n 100 第二行n行,每行兩個整數xi,yi表示座標 1 xi,yi 1000 y軸正方向為北,x軸正方形為東。輸出乙個...
牛客網機試題 最短路徑(並查集)
n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出 ...