贪心题
标签(空格分隔): 贪心
题目
链接: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