【bzoj2563】 阿狸和桃子的游戏

题目

非常妙的题目,一看到就以为是一道博弈,之后就不会做了

正解非常巧妙,由于我们只需要求出最后两个人得分的差值,所以对于每一条边我们将其的权值拆成两边,分给其连接的两个点

如果这两个点被同一个人选择,那么这条边的边权就会加到最后这个人的总得分里去,如果被两个人分别选择,那么两个人每个人都获得了权值的一半,对最后的差值没有什么影响

所以拆分边权之后排序就好了,非常显然每个人都要选择点权最大的点

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define re register
#define maxn 100005
inline int read()
{
	char c=getchar();
	int x=0,r=1;
	while(c<'0'||c>'9')
	{
		if(c=='-') r=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
		x=(x<<3)+(x<<1)+c-48,c=getchar();
	return x*r;
}
int n,m,a[maxn];
inline int cmp(int A,int B)
{
	return A>B;
}
int main()
{
	n=read(),m=read();
	for(re int i=1;i<=n;i++) a[i]=read()*2;
	int x,y,z;
	for(re int i=1;i<=m;i++)
	{
		x=read(),y=read(),z=read();
		a[x]+=z,a[y]+=z;
	}
	std::sort(a+1,a+n+1,cmp);
	int ans=0;
	for(re int i=1;i<=n;i++)
	if(i&1) ans+=a[i];
		else ans-=a[i];
	std::cout<<(ans>>1);
	return 0;
}

posted @ 2019-01-02 12:17  asuldb  阅读(141)  评论(0编辑  收藏  举报