AHOI2014 JSOI2014 騎士遊戲

2022-05-02 02:12:12 字數 1291 閱讀 2324

傳送門

考慮 \(\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 有乙個顯而易見的性質就是我們不會用 ...