通关【算法赛】
链接 :通关【算法赛】 - 蓝桥云课 (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; }
本文作者:zouyua
本文链接:https://www.cnblogs.com/ZouYua/p/17790245.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步