思路:
对于一条边来说, 如果拿了一个点, 说明已经拿了该边的一半权值。
如果某边的两个的顶点分别是不同的人。 那么差值还是不变的。
如果某边的两个顶点分别是同一个人。 那么和值也不变。
所以我们可以把一个边分解到两个顶点上,然后依次Alice 取最大,Bob 取次大。 因为 他们都是绝顶聪明的。
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 double d[100001],ans; 6 int main(){ 7 int n,m,i,u,v,w; 8 while(scanf("%d%d",&n,&m)!=EOF){ 9 for(i=1;i<=n;i++) scanf("%lf",&d[i]); 10 for(i=0;i<m;i++){ 11 scanf("%d%d%d",&u,&v,&w); 12 d[u]+=w/2.0; 13 d[v]+=w/2.0; 14 } 15 sort(d+1,d+n+1); 16 ans=0.0; 17 for(i=n;i>=1;i-=2) ans+=d[i]-d[i-1]; 18 printf("%.0lf ",ans); 19 } 20 return 0; 21 }