bzoj2563阿狸和桃子的游戏

题意:

一个n(偶数)点图,节点权值为w(v),边权为c(e)。两人轮流将图中的顶点染色,已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个顶点染色。染完后每个人的分数为染过的点权和以及两个端点都被染的边权和。如果两人都是采用最优策略的,求最终第一个人的分数减去第二个人的分数。n≤10000,边数≤100000

题解:

本弱只能引用神犇的题解

考虑先手选择每个点对答案的影响

一个点如果不选,本身对答案的贡献是-w,一个点如果选,本身对答案的贡献是w,一条边如果两个端点都不选,对答案的贡献是-c,如果两个端点中只选择一个,对答案的贡献是0,如果两个端点都选,对答案的贡献是c,那么我们先预先把所有的权值都在初始答案中减掉,然后就变成了:

一个点如果不选,本身对答案的贡献是0,一个点如果选,本身对答案的贡献是2*w,一条边如果两个端点都不选,对答案的贡献是0,如果两个端点中只选择一个,对答案的贡献是c,如果两个端点都选,对答案的贡献是2*c,那么令一个点的贡献值为本身点权的二倍+所有相连的边的边权,排个序两人轮流取最大即可。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 10010
 5 #define inc(i,j,k) for(int i=j;i<=k;i++)
 6 #define ll long long
 7 using namespace std;
 8
 9 int n,m; ll w[maxn],ans1,ans2;
10 bool cmp(ll a,ll b){return a>b;}
11 inline int read(){
12     char ch=getchar(); int f=1,x=0;
13     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar();
14     return f*x;
15 }
16 int main(){
17     n=read(); m=read(); inc(i,1,n)w[i]=(ll)read()<<1,ans2+=w[i]>>1;
18     inc(i,1,m){int a=read(),b=read(); ll c=(ll)read(); ans2+=c; w[a]+=c; w[b]+=c;} sort(w+1,w+n+1,cmp);
19     inc(i,1,n){if(i&1)ans1+=w[i];}
20     printf("%lld",ans1-ans2); return 0;
21 }

20160623

时间: 2024-08-26 21:46:32

bzoj2563阿狸和桃子的游戏的相关文章

Bzoj2563 阿狸和桃子的游戏

Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 701  Solved: 496 Description 阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e).游戏规则是这样的: 1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子会将顶点染成粉色.已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个顶点染色. 2. 为了保证公平性,节点的个数N为偶数. 3. 经过N/2轮游戏之

阿狸和桃子的游戏题解

阿狸和桃子的游戏题解 每一道代码简单的黑题都有着诡异的思想,真不知道出题者怎么想的. 而这道题的重点在于把边权转换为点权, 此题的方式是将边权w平均分给被连接的两点u和v. 若u和v都被一人选择,则他的分数较不加边权前多了w/2+w/2=w, 若被不同的人选择,分数差多了(ans1+w/2)-(ans2-w/2)=ans1-ans2 并不会对答案有什么影响. 所以,最优策略? 肯定选择点权最大的了. 排序后依次选择即可. #include<bits/stdc++.h> using namesp

【BZOJ2563】阿狸和桃子的游戏 贪心

依然加链接 #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44499259"); } 题解: PoPoQQQ大爷已经说得很详细了. http://blog.csdn.net/PoPoQQQ/article/details/44495319 代码: #include <cstdio&g

bzoj 2563: 阿狸和桃子的游戏

开始写了一些东西但是后来浏览器挂了就没有存下来简直!!!!!!!!!!!!!QAQ 不想再写一遍了...总之是简单贪心. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #define MAXN 10005 7 using namespace std; 8 int n, m, a[M

BZOJ 2563 阿狸和桃子的游戏 贪心

题目大意:给定一张无向图,每个点有点权,每条边有边权,两个人轮流选择点,若一条边的两端点被选择则这条边被选择,两人都想自己的得分-对手的得分最大,求最终先手得分-后手得分 考虑先手选择每个点对答案的影响 一个点如果不选,本身对答案的贡献是-w 一个点如果选,本身对答案的贡献是w 一条边如果两个端点都不选,对答案的贡献是-c 如果两个端点中只选择一个,对答案的贡献是0 如果两个端点都选,对答案的贡献是c 那么我们先预先把所有的权值都在初始答案中减掉,然后就变成了: 一个点如果不选,本身对答案的贡献

【BZOJ】2563: 阿狸和桃子的游戏

http://www.lydsy.com/JudgeOnline/problem.php?id=2563 题意:给一个n个加权点m条加权边的无向图,两个人轮流拿走一个点,最后使先手得分-后手得分尽量大.一个人的得分等于拿到的点的点权和+边的两个端点在这个点集的边的边权和.(n<=10000, m<=100000) #include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[10005], ans;

luoguP4643 阿狸和桃子的挑战 思维

看下数据范围: \(n \leq 14\),emmmm,状压\(dp\)的分 \(n \leq 10000, m \leq 100000\),emmmm.....???,这是什么数据范围? 再观察一下所求 点十分好控制,边非常不好控制 能不能把边转化为点呢? 把边给均分给两边的点? 诶,好像可以了..... 然后就没了..... #include <cstdio> #include <vector> #include <cstring> #include <ios

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw

bzoj 2563 贪心 思想

2563: 阿狸和桃子的游戏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 682[Submit][Status][Discuss] Description 阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e).游戏规则是这样的: 1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子会将顶点染成粉色.已经被染过色的点不能再染了,而且每一轮都必须给一个且仅一个