题意:让一个机器在一棵有根树上吃东西,这个机器每次只能移动到邻近的一个有动物的点,并且可以吃掉一只动物,然后进行新的运动。
问在机器可以返回根节点的情况下,机器最多可以吃的动物。
做法:唉,只能看看Tutorial #1。运用贪心的策略,先求出每个子节点多可以吃到的动物数为y,自己节点剩下的动物数为x。一开始,父节点要去字节点,一定要消耗自己的一只动物,而这里就必须“择优录取子节点了”,即把子节点按x排序,然后进行一次遍历,如果最后父节点还可以剩下一些动物,那就在根据y进行计算,直到父子之间某一方的动物被吃光。
这里蕴含的贪心策略,一开始总是有点难不准。或许在有限的资源下,可以往资源利用率的方向思考,因为这里的资源利用率,是可以静态确定下来的,而不像背包问题。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
#define LL long