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 }