zoukankan      html  css  js  c++  java
  • 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
    ",ans/2); 
        return 0;   
    }
    

      

  • 相关阅读:
    P5331 [SNOI2019]通信
    P3700 [CQOI2017]小Q的表格
    Linux
    P3268 [JLOI2016]圆的异或并
    P3317 [SDOI2014]重建
    P5492 [PKUWC2018]随机算法
    P3210 [HNOI2010]取石头游戏
    支配树
    P5401 [CTS2019]珍珠
    P4027 [NOI2007]货币兑换
  • 原文地址:https://www.cnblogs.com/guangheli/p/11760763.html
Copyright © 2011-2022 走看看