hdu 4647(简单贪心)
2013-08-07 10:22
375 查看
Sample Input
Sample Output
题意: 有N个点,M条边。 点有权值, 边有权值。 Alice, Bob 分别选点。 如果一条边的两个顶点被同一个人选了, 那么能获得该权值。问 Alice - Bob?
思路: 贪心。
对于一条边来说, 如果拿了一个点, 说明已经拿了该边的一半权值。
如果某边的两个的顶点分别是不同的人。 那么差值还是不变的。
如果某边的两个顶点分别是同一个人。 那么和值也不变。
所以我们可以把一个边分解到两个顶点上。
然后依次Alice 取最大,Bob 取次大。 因为 他们都是绝顶聪明的
4 0 9 8 6 5
Sample Output
2
题意: 有N个点,M条边。 点有权值, 边有权值。 Alice, Bob 分别选点。 如果一条边的两个顶点被同一个人选了, 那么能获得该权值。问 Alice - Bob?
思路: 贪心。
对于一条边来说, 如果拿了一个点, 说明已经拿了该边的一半权值。
如果某边的两个的顶点分别是不同的人。 那么差值还是不变的。
如果某边的两个顶点分别是同一个人。 那么和值也不变。
所以我们可以把一个边分解到两个顶点上。
然后依次Alice 取最大,Bob 取次大。 因为 他们都是绝顶聪明的
#include<cstdio> #include<cstring> #include<map> #include<vector> #include<cmath> #include<cstdlib> #include<stack> #include<queue> #include<iostream> #include<algorithm> using namespace std ; int n, m, ans; double num[100010]; bool cmp(__int64 a, __int64 b) { return a > b; } int main() { int i, j,n,m; while(~scanf("%d%d", &n, &m)) { for(i = 1; i <= n; ++i) scanf("%lf", &num[i]); while(m--) { int u, v, w; scanf("%d%d%d", &u, &v, &w); num[u] += w / 2.0; num[v] += w / 2.0; } sort(num + 1, num + n + 1, cmp); double a, b; a = b = 0.0; for(i = 1; i <= n; ++i) { if(i % 2 == 1) a += num[i]; else b += num[i]; } printf("%I64d\n", (__int64)(a - b)); } return 0; }
相关文章推荐
- hdu 1257 最少拦截系统(简单dp+贪心)
- hdu 2480 贪心+简单并查集
- hdu 2600 简单贪心
- hdu 1009 简单贪心
- HDU - 5999 The Third Cup is Free 贪心 简单题
- HDU4647+贪心
- HDU 1051 Wooden Sticks (简单贪心)
- 简单的贪心算法 HDU 2037 今年暑假不AC
- 简单贪心-hdu-3697-Selecting courses
- hdu 2021 发工资咯:)(简单贪心)
- HDU:3420 Bus Fair, 3090 Go Home+uva:11729 Commando War(简单贪心)
- hdu 4647 Another Graph Game (贪心)
- HDU 1009 FatMouse' Trade 简单贪心,细节处理
- HDU 1800 简单贪心 13.1.10用trie重做 ---其实是统计出现次数最多的单词
- hdu 2124 简单贪心
- hdu 1969 Pie(贪心+二分查找)(简单)
- hdu 4442 Physical Examination 简单贪心
- HDU acm step:Chapter one section three(简单贪心)
- HDU-1009-FatMouse' Trade(简单贪心!)
- hdu 5742 简单贪心