BZOJ2563: 阿狸和桃子的游戏(巧妙的贪心)

决定以后写博客还是把题意写上 
题意:给一个含点权和边权的图 两个人轮流操作 每次选一个点 选完后最后每个人的得分为 所有选择点的点权 + 如果选了这条边两个端点的边权 最后输出这两个人的分数差

题解:贪心就行。。。 把每条边的边权平分给包含他的两个点,这样如果这条边被一个人选了刚好就加上了这条边的边权,如果被两个人选择到了,答案刚好一减,排个序贪心, 给思路跪了。
然后注意下如果边权为奇数 分不尽的情况 所以用double
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;

double q[10005];

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);

    for(int i = 1; i <= n; i++) scanf("%lf", &q[i]);
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        double v;
        scanf("%d%d%lf", &x, &y, &v);
        q[x] += v / 2.0;
        q[y] += v / 2.0;
    }
    sort(q + 1, q + 1 + n);
    double ans1 = 0, ans2 = 0;

    int f = 0;
    for(int i = n; i >= 1; i--)
    {
        if(!f) ans1 += q[i], f = 1;
        else ans2 += q[i], f = 0;
    }
    printf("%d\n", (int)(ans1 - ans2));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值