思路:
树上对子树的问题可以考虑将子树向上合并来解决.
对于本题, 可以使用可并堆来向上合并.
具体来说, 由于被雇佣的忍者除薪水外本质上是一样的, 当超出预算时先排除薪水较高的更优.
于是可以构造一个大根堆, 同时维护当前堆中薪水总和, 当总和超出预算时将堆顶弹出直至总和小于等于预算.
代码:
1 |
|
树上对子树的问题可以考虑将子树向上合并来解决.
对于本题, 可以使用可并堆来向上合并.
具体来说, 由于被雇佣的忍者除薪水外本质上是一样的, 当超出预算时先排除薪水较高的更优.
于是可以构造一个大根堆, 同时维护当前堆中薪水总和, 当总和超出预算时将堆顶弹出直至总和小于等于预算.
1 | #include <cstdio> |