牛客网_题





贪心题

标签(空格分隔): 贪心


题目

链接:https://www.nowcoder.com/acm/contest/123/C
来源:牛客网

题目描述
There are? cities in Byteland, and the??city has a value?.
The cost of building a bidirectional road between two cities is the sum of their values.
Please calculate the minimum cost of connecting these cities,
which means any two cities can reach each other.

输入描述:
The first line is an integer? representing the number of test cases.
For each test case, the first line is an integer ,?
representing the number of cities, the
second line are? positive integers?,
representing their values.

输出描述:
For each test case, output an integer,
which is the
minimum cost of connecting these cities

翻译: 在Byteland有城市,这个城市有价值。
在两个城市之间建立双向道路的成本是其价值的总和。
请计算连接这些城市的最低成本,这意味着任何两个城市都可以达到对方。

输入描述:

第一行是一个整数 T(T<= 10^5)
代表测试用例的数量。
对于每个测试用例,第一行是一个整数nn(n <= 10^5),代表城市的数量
第二行是正整数ai(ai <= 10^5),
代表他们的价值。

输出描述:

对于每个测试用例,输出一个整数,即
连接这些城市的最低成本。

示例1:
输入
2
4
1 2 3 4
1
1
输出
12
0

这里写图片描述

思考:

A到C 有很多种走法 我们只比较 A->B->C 和 A->C 的走法
A->B->C 成本 A+B+C
A->C    成本 A+C
因此,很容易发现两个城市之间最低成本就是直接两个城市相连。因此很容易想到 -> 以一个成本最少的城市作为源点,让其与其他城市相连,成本必定最小。
设a1 + a2 + …… + an == sum, 设 a1 成本最小,那么总成本为-> (a1 + a2) + (a1 + a3) + ………… + (a1 + an) == a1 * (n-1) + (a2 + a3 + …… + an) == a1 * (n-2) + sum

代码:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    long long int x[100100];
    int main()
    {
        int T;
        cin >> T;
        while(T--)
        {
            long long int sum = 0;// 由于变量的取值范围 故要用 long long int
            long long int minn = 10010000000, n;//初始给minn一个极大值
            cin >> n;
            for(int i=0; i<n; i++)
            {
                cin >> x[i];
                sum += x[i];// 计算城市的总价值
                if(x[i] < minn)
                    minn = x[i];// 得到价值最小的城市
            }
            if(n == 1)
            {
                cout << "0" << endl;// 一个城市不需要修路 故为0
                continue;
            }
            minn = (sum - minn) + (n-1) * minn;// 以最小价值的城市为中心源点  
             //Ps: 这里变量偷懒重复用,平时学习时最好不要,容易记混。
            cout << minn << endl;
        }
        return 0;
    }

Edit By MaHua

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值