bzoj 2563: 阿狸和桃子的游戏 贪心

一世执手 提交于 2019-12-02 19:32:17

这个真的好巧妙啊~ 

如果只考虑点权的话显然直接按照权值大小排序即可. 

但是加入了边权,就有了一个决策的问题. 

于是,我们将边权分一半,分给两个端点.   

如果一个人拿了两个端点,则边权都会加上. 

否则,边权会抵消.   

直接按照点权+一半边权排序即可.    

code: 

#include <bits/stdc++.h>  
#define N 100004   
#define LL long long 
using namespace std;  
void setIO(string s) 
{
    string in=s+".in"; 
    freopen(in.c_str(),"r",stdin);    
}    
LL a[N];   
int main() 
{ 
    // setIO("input");       
    int n,m,i,j; 
    scanf("%d%d",&n,&m);     
    for(i=1;i<=n;++i) scanf("%lld",&a[i]),a[i]<<=1;   
    for(i=1;i<=m;++i) 
    {
        int x,y; 
        LL z; 
        scanf("%d%d%lld",&x,&y,&z);  
        a[x]+=z,a[y]+=z;  
    } 
    sort(a+1,a+1+n); 
    LL ans=0ll; 
    for(i=1;i<n;i+=2) 
    {
        ans+=a[i+1]-a[i];  
    } 
    printf("%lld\n",ans/2); 
    return 0;   
}

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!