• hdu 4647 Another Graph Game,想到了就是水题了。。


    题目是给一个无向图,其中每个节点都有点权,边也有边权,然后就有2个小朋友开始做游戏了ALICE &BOB 游戏规定ALICE 先行动然后是BOB,然后依次轮流行动,行动时可以任意选取一个节点并获得节点的点权,如果他已经把一条边的2个端点都取了,那么他可以获得那边的边权,如果一条边的二个端点不同的人取了,那么谁也得不到那条变得边权了。 问游戏结束后怎样可以使ALICE得到的权值和减去BOB 的权值和最大,当然二个人都一样足够聪明,即每次行动都会采取最优的策略

    解法若没有边权,则对点权从大到小排序即可。。考虑边,将边权拆成两半加到它所关联的两个点的点权中即可。。。因为当两个人分别选择不同的点时,这一权值将互相抵消。

    想想很好理解的,因为最后求的是差值。。。

    需要注意的就是要用long long 别的就没什么了,为了避免拆边时出现分数,可以算结果的2倍最后输出的时候再除以2就行

    下面是代码:

    #include<cstdio>
    #include<algorithm>
    bool inline cmp(long long a,long long b){return a>b;}//递减排序的cmp函数
    long long node[100005],ans;
    int N,M;
    int read()
    {
    	if(scanf("%d%d",&N,&M)!=2) return 0;
    	for(int i=1;i<=N;i++)
    	{
    		scanf("%I64d",&node[i]);
    		node[i]*=2;//存2倍的点权
    	}
    	for(int a,b,c,i=0;i<M;i++)
    	{
    		scanf("%d%d%d",&a,&b,&c);
    		node[a]+=c,node[b]+=c;//拆边就不用除以2了
    	}
    	std::sort(node+1,node+N+1,cmp);//递减排序
    	ans=0;
    	for(int i=0;i<N/2;i++)
    		 ans+=node[2*i+1]-node[2*i+2];//算结果
    	printf("%I64d
    ",ans/2);//输出的结果要除以二
    	return 1;
    }
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	while(read());
    	return 0;
    }
    


  • 相关阅读:
    CI框架(Codeigniter)总结
    ssh自动下载SFTP文件
    数据库设计原则
    Java代码性能优化的 39个细节
    quartz定时任务时间设置
    Myeclipse 反编译工具插件
    Maven -- 使用Myeclipse创建Maven项目
    详解Java Web项目启动执行顺序
    java web项目下的lib和build path 中jar包问题解惑
    java读取存在src目录下和存在同级目录下的配置文件
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3243767.html
Copyright © 2020-2023  润新知