• 【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;
    }
    
    
  • 相关阅读:
    【c语言】使用NULL和指针来寻找数组中是否存在指定的数字
    【c语言】利用指针求三个数的最大数和最小数
    【c语言】统计一个整数所包含的素因子并输出
    【c语言】比较两个分数的大小
    心情
    matlab
    越来越懒了
    研究生学习
    谢谢
    elasticsearch 索引
  • 原文地址:https://www.cnblogs.com/asuldb/p/10207894.html
Copyright © 2020-2023  润新知