HDU 4647 Another Graph Game

如果没有边的作用,显然轮流拿当前的最大值即可。

加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值;如果分别被两个人拿走,两人的差值不变。

将边权平均分配给点,对点的权值排序轮流选择。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #define MAXN 100010
 5 #define EPS 1e-8
 6 typedef long long LL;
 7 using namespace std;
 8 double arr[MAXN];
 9 int main() {
10     int n, m;
11     int i;
12     int x, y, val;
13     double a, b;
14     while (~scanf("%d%d", &n, &m)) {
15         for (i = 1; i <= n; i++) {
16             scanf("%lf", &arr[i]);
17         }
18         for (i = 0; i < m; i++) {
19             scanf("%d%d%d", &x, &y, &val);
20             arr[x] += val * 0.5 + EPS;
21             arr[y] += val * 0.5 + EPS;
22         }
23         sort(arr + 1, arr + 1 + n);
24         a = b = 0;
25         for (i = n; i > 0; i -= 2) {
26             a += arr[i];
27             b += arr[i - 1];
28         }
29         cout << (LL) (a - b + EPS) << endl;
30     }
31     return 0;
32 }
View Code

相关文章: