傳送門
考慮 \(\text\)。
設 \(dp_i\) 表示滅種(霧)乙隻編號為 \(i\) 的怪物的代價。
那麼轉移顯然是:
\[dp_i = \min(k_i, s_i + \sum_^ dp_)
\]但是我們會發現這個東西是有後效性的。。。
所以我們會想要用建圖然後跑乙個最短路什麼的來搞。。。
於是我們觀察到上面那個 \(\text\) 式子中,\(dp_i\) 如果用後面那一項來轉移,顯然會有 \(dp_ < dp_i\)。
這提示我們,為了消除後效性,可以對 \(dp\) 值排序。
準確的說就是開乙個堆來搞,每個點初始的 \(dp\) 值都是消滅它的魔法消耗,然後優先更新較小的 \(dp\) 值,
畢竟我們對於魔法消耗最小的怪物肯定是直接消滅(因為你到頭來都要幹死它何必生出一些魔法消耗更高的嘞)
然後我們建圖方式就是反著來,如果 \(i\) 會生出 \(j\),那麼連邊 \(j \to i\),然後我們就跑乙個長的有點像 \(\text\) 的 \(\text\) 就好了。
參考**:
#include #include #define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class t > inline void read(t& s)
typedef long long ll;
const int _ = 2e5 + 5, __ = 1e6 + 5;
int tot, head[_]; struct edge edge[__];
inline void add_edge(int u, int v) , head[u] = tot; }
int n, r[_], vis[_]; ll dp[_], s[_], k[_];
struct node ;
inline bool operator < (const node& x, const node& y)
priority_queue < node > q;
int main()
for (rg int i = 1; i <= n; ++i) q.push((node) );
while (!q.empty()) );}}
printf("%lld\n", dp[1]);
return 0;
}
AHOI2014 JSOI2014 騎士遊戲
題目背景 長期的宅男生活中,jyy又挖掘出了一款rpg遊戲。在這個遊戲中jyy會 扮演乙個英勇的騎士,用他手中的長劍去殺死入侵村莊的怪獸。題目描述 在這個遊戲中,jyy一共有兩種攻擊方式,一種是普通攻擊,一種是法術攻擊。兩種攻擊方式都會消耗jyy一些體力。採用普通攻擊進攻怪獸並不能把怪獸徹底殺死,怪...
AHOI2014 JSOI2014 騎士遊戲
題目 思博貪心題寫了乙個半小時沒救了,我也沒看出這是乙個 spfa 來啊 設 dp i 表示徹底乾掉第 i 只怪物的最小花費,乙個非常顯然的事情,就是對於 k i 值最小的怪物滿足 dp i k i 非常好理解,反正到最後都要乾掉這個怪物,何必再把它乾成別的怪物 於是我們按照 k i 的值先排序一下...
AHOI2014 JSOI2014 宅男計畫
傳送門 我們首先要發現乙個性質 存貨天數隨買食物的次數的變化類似於單峰函式。具體證明不會啊,好像是二分加三分來證明?但是沒有找到明確的嚴格證明。感性理解一下就是 買的食物太少,很容易餓死 買太多就沒錢了,也活不長。所以我們考慮如何對於當前三分的答案如何 text 有乙個顯而易見的性質就是我們不會用 ...