题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1252
思路:考虑每条边对玩家的伤害
假设连接的节点是u,v,破坏力是p[u]和p[v]
假设p[u]>p[v]
现在考虑u,v的删除顺序,如果先删u,这条边对玩家的伤害,是p[v],先删v,伤害是p[u]
所以显然对于每条边,我们都要先删权值大的,才能最好
怎么样才能对于每条边先删最大的呢,那就按照权值递减删就好了
所以 ret=Σ(min(p[u],p[v]))
复杂度O(n)
#include <cstdio> using namespace std; const int N=1e5+5; int p[N]; int main(){ int n; while(~scanf("%d",&n)){ for(int i=1;i<=n;++i) scanf("%d",&p[i]); int ret=0; for(int i=1;i<n;++i){ int u,v; scanf("%d%d",&u,&v); ret+=min(p[u],p[v]); } printf("%d\n",ret); } return 0; }