链接:https://www.nowcoder.com/acm/contest/52/K
来源:牛客网
题目描述
萌萌哒栗酱有n个点,第i个点有点权ai(ai为偶数),你可以在任意两点之间添加一条边,每一条边的边权为连接它的两个点的点权之和除以2。
现在她需要添加n-1条边,使任意两点相互连通,并且连通后的边权和最大。
输入描述:
第一行一个数T,表示有T组数据。
对于每组数据,第一行输入一个数n,表示点的数量,
接下来一行输入n个数,a1,a2,…,an,其中ai表示第i个点的点权。
任意两个相邻数之间用空格隔开。
输出描述:
对于每一组数据,输出一个数,即最大边权和。
示例1
输入
2
5
4 2 4 4 2
10
10 2 6 4 6 8 10 8 2 10
输出
14
73
备注:
T≤10
1≤n≤103
1≤ai≤103,保证ai为偶数。
思路:不需要其他图的知识,在所有的点中找到最大值,连其余的点,那么总和就是max*(n-1)(最大的点与其他n-1个点相连)再加上sum-max(即与最大点相连的其他点的总和)最后除以二。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int sum = 0;
int max = 0;
int result;
int T;
int a[1001];
cin>>T;
while(T--)
{
int n;
int sum = 0;
int max = 0;
memset(a,0,sizeof(a));
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
max = max>a[i]?max:a[i];
sum += a[i];
}
result = (max*(n-1)+(sum-max))/2;
cout<<result<<endl;
}
return 0;
}