『贪心』阿狸和桃子的游戏

在这里插入图片描述

题解

显然,这道题目的点权很容易去分配,其关键便在于边权的处理上,即如何处理两种边权的情况。

还有一个问题在于,什么叫做当前的最优选择,点权和边权的不同意味着有不同的选择方法,这也让这道题变得非常的棘手。

我们便来思考一下,如何解决这两个问题呢?

  • 显然这个问题,每一步都要有一个固定的选择方法,即必须以一个固定的标准评判究竟那个最优。
  • 并且,这个标准只能由一个具体的数值来表现。
  • 由于每次取的是点权,我们必须以点作为评判标准。

那么如何将边权转移到点权上呢?观察到特殊的性质,我们发现题目仅仅要求我们输出差值。因此我们可以利用这个特性作为解决问题的突破口。要两者都选相抵消,只有一个人则累加,我们可以将边权一半一半的平均分配到点权里。这样,这个问题就迎刃而解了。

代码如下:

#include <bits/stdc++.h>

using namespace std;
const int N = 100000;

int n, m;
int a[N];

int main(void)
{
    scanf("%d %d", &n, &m);
    for (int i=1;i<=n;++i) 
        scanf("%d", a+i), a[i] *= 2;
    while (m --) {
        int x, y, v;
        scanf("%d %d %d", &x, &y, &v);
        a[x] += v, a[y] += v;
    }
    sort(a+1,a+n+1);
    reverse(a+1,a+n+1);
    int sum1 = 0, sum2 = 0;
    for (int i=1;i<=n;++i) 
        i % 2 == 1 ? sum1 += a[i] : sum2 += a[i];
    cout<<(sum1-sum2) / 2<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值