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

这个真的好巧妙啊~ 

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

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

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

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

否则,边权会抵消.   

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

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;   
}

  

posted @ 2019-10-29 18:44  EM-LGH  阅读(131)  评论(0编辑  收藏  举报