『贪心』阿狸和桃子的游戏
作者:互联网
题解
显然,这道题目的点权很容易去分配,其关键便在于边权的处理上,即如何处理两种边权的情况。
还有一个问题在于,什么叫做当前的最优选择,点权和边权的不同意味着有不同的选择方法,这也让这道题变得非常的棘手。
我们便来思考一下,如何解决这两个问题呢?
- 显然这个问题,每一步都要有一个固定的选择方法,即必须以一个固定的标准评判究竟那个最优。
- 并且,这个标准只能由一个具体的数值来表现。
- 由于每次取的是点权,我们必须以点作为评判标准。
那么如何将边权转移到点权上呢?观察到特殊的性质,我们发现题目仅仅要求我们输出差值。因此我们可以利用这个特性作为解决问题的突破口。要两者都选相抵消,只有一个人则累加,我们可以将边权一半一半的平均分配到点权里。这样,这个问题就迎刃而解了。
代码如下:
#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;
}
标签:阿狸,int,边权,我们,评判,最优,桃子,点权,贪心 来源: https://blog.csdn.net/Ronaldo7_ZYB/article/details/95084688