2017年浙江工业大学大学生程序设计迎新赛预赛 K 【看似是图其实是贪心】

链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值