通关【算法赛】
链接 :通关【算法赛】 - 蓝桥云课 (lanqiao.cn)


题意 给你每个点的树形关系,初始经验为p, 每个节点都有两个关系, ex, nex, 表示通关可以获得的经验值和通关需要的经验值,在未通过父亲节点时不可以通过子节点,问最多能通过多少关?
题目中考虑的时最多的关数,一开始写的dfs贪的,后来发现每层有一定的顺序,而dfs是一直到底,考虑用一种数据结构维护,因为贪心是先通过每一层nex最小,可以不断使p增大,就可以通过尽量多的关,于是可以用pair的优先队列维护,第一维是需要的经验,第二维是当前节点, 当需要最小经验都小于目前经验时就可以退出,后续一定无法通过其他节点
ll n, p, cn; ll ex[N], nex[N]; vector<int> g[N]; void f() { priority_queue<PII, vector<PII>, greater<PII> > q; q.push({nex[1], 1}); while(q.size()) { auto t = q.top(); q.pop(); if(p < t.first) break; int u = t.second; p += ex[u]; cn ++; for(auto v : g[u]) { q.push({nex[v], v}); } } } int main() { cin >> n >> p; for(int i = 1; i <= n; i ++) { int v; cin >> v >> ex[i] >> nex[i]; g[v].pb(i); } f(); cout << cn << endl; return 0; }

浙公网安备 33010602011771号