1
希望对你有帮助.|

zouyua

园龄:1年10个月粉丝:3关注:3

通关【算法赛】

链接 :通关【算法赛】 - 蓝桥云课 (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 中国大陆许可协议进行许可。

posted @   zouyua  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起