codeforces 1540A Great Graphs

题目描述

n个点,d[i]表示i到第一个点的距离,现在加边,可以加负边,使得距离之和最小

思路

1、排序
2、最后一个数位最大值,也是正向最大的代价
然后尽可能多的建立负边
2.1、从距离较远的点到距离较近的点是负边,可以理解为从较远的点到达起点,其中较远到起点之间有多少过程点,就建立多少条较远点到起点的负边,然后再从起点到各个中间点。
ex:0,2,3,4,5
距离为4的点,到0、2、3有三条边,分别为从4到0,从4到2,从4到3,从4到2的点,相当于从4到0再从0到2,

AC代码

#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define ll long long
ll t, n;
ll d[N];

int main()
{
    cin >> t;
    while (t--)
    {
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cin >> d[i];
        }
        sort(d, d + n);
        ll ans = 0, sum = 0;
        for (int i = 0; i < n; i++)
        {
            ans -= d[i] * i - sum;
            sum += d[i];
        }
        ans += d[n - 1];
        cout << ans << endl;
    }
    //system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.0-0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值