您的位置:首页 > 其它

hdu 4647 Another Graph Game

2013-08-07 09:40 260 查看
点击打开hdu 4647

思路: 贪心

1 若没有边权,则对点权从大到小排序即可

2 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可。因为当两个人分别选择不同的点时,这一权值将互相抵消

3 如果把边折半的时候可能是把边权为奇数,那么我们在处理的时候就把所有的权值乘以2,然后最后ans/2即可

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long int64;
const int MAXN = 100010;

int n , m;
int64 val[MAXN];

int main(){
int x , y , v;
while(scanf("%d%d" , &n , &m) != EOF){
for(int i = 1 ; i <= n ; i++){
scanf("%d" , &v);
val[i] = 2*v;
}
for(int i = 0 ; i < m ; i++){
scanf("%d%d%d" , &x, &y , &v);
val[x] += v;
val[y] += v;
}
sort(val+1 , val+n+1);
int64 sum1 , sum2;
sum1 = sum2 = 0;
for(int i = 1 ; i <= n ; i += 2){
sum1 += val[i];
if(i <= n)
sum2 += val[i+1];
}
printf("%lld\n" , abs(sum1-sum2)/2);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: