通关【算法赛】

链接 :通关【算法赛】 - 蓝桥云课 (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;
}

 

posted @ 2023-10-26 19:55  zouyua  阅读(27)  评论(0)    收藏  举报