BZOJ 2563 阿狸和桃子的游戏
2016-11-13 11:01
204 查看
题意:给定一张点数为偶数的无向图,每个点有点权,每条边有边权,权值可以为负。两个人轮流操作,每次可以占领一个未被占领的点,同时,若一条边的两端点都被同一人占领,那么这条边也会属于那个人。两人都想自己的得分-对手的得分最大,求最终先手得分-后手得分。
题解:考虑先手选择每个点对答案的影响:一个点如果不选,本身对答案的贡献是-w;一个点如果选,本身对答案的贡献是w;一条边如果两个端点都不选,对答案的贡献是-c;如果两个端点中只选择一个,对答案的贡献是0;如果两个端点都选,对答案的贡献是c。
题解:考虑先手选择每个点对答案的影响:一个点如果不选,本身对答案的贡献是-w;一个点如果选,本身对答案的贡献是w;一条边如果两个端点都不选,对答案的贡献是-c;如果两个端点中只选择一个,对答案的贡献是0;如果两个端点都选,对答案的贡献是c。
/* ID:Agreement */ //invincible #include <bits/stdc++.h> #define rep( i , l , r ) for( int i = (l) ; i <= (r) ; ++i ) #define per( i , r , l ) for( int i = (r) ; i >= (l) ; --i ) #define erep( i , u ) for( int i = head[(u)] ; ~i ; i = e[i].nxt ) using namespace std; const int maxn = 10000 + 5; typedef long long ll; ll ans , a[maxn]; int N , M; int main(){ int x , y , w; scanf("%d %d" , &N , &M); rep( i , 1 , N ){ scanf("%d" , &w); ans -= w; a[i] = w << 1; } rep( i , 1 , M ){ scanf("%d %d %d" , &x , &y , &w); ans -= w; a[x] += w , a[y] += w; } sort( a + 1 , a + 1 + N ); for( int i = 2 ; i <= N ; i += 2 ) ans += a[i]; cout << ans << endl; return 0; }
相关文章推荐
- bzoj 2563 阿狸和桃子的游戏
- [bzoj2563][贪心]阿狸和桃子的游戏
- [BZOJ2563]阿狸和桃子的游戏(贪心)
- BZOJ 2563 : 阿狸和桃子的游戏
- BZOJ——2563: 阿狸和桃子的游戏
- BZOJ 2563 阿狸和桃子的游戏
- BZOJ 2563: 阿狸和桃子的游戏 贪心 思路题
- [bzoj2563]阿狸和桃子的游戏
- BZOJ 2563: 阿狸和桃子的游戏(巧妙的贪心)
- bzoj2563 阿狸和桃子的游戏
- BZOJ 2563: 阿狸和桃子的游戏
- 【bzoj2563】阿狸和桃子的游戏 贪心
- 【BZOJ 2563】 阿狸和桃子的游戏 脑洞+贪心
- 【BZOJ】2563: 阿狸和桃子的游戏
- BZOJ 2563 阿狸和桃子的游戏 题解(贪心)
- BZOJ 2563 阿狸和桃子的游戏 (贪心)
- BZOJ 2563: 阿狸和桃子的游戏
- 【bzoj2563】阿狸和桃子的游戏 脑洞
- bzoj 2563 阿狸和桃子的游戏 - 贪心
- 【bzoj2563】阿狸和桃子的游戏