2020 蓝桥杯大学模拟赛(三) - 程序设计:养猫题解


题目描述

众所周知的,⼩明家⾥有好多猫,经过⼀次“猫⼝普查”,我们得到了以下信息:

⼩明家⾥有 n 只猫,第 i 只猫的体重是 ai 。然⽽⼩明热爱虐猫(并不),他决定对这些猫做⼀些有 ♂趣的事情

经过了两年半的练习之后,这些猫已经能完全听懂⼩明的指令了。

⼩明的指令分成两个阶段,具体步骤如下:

  • 1.指定⼀种颜⾊,所有这种颜⾊的猫都会从猫窝⾥跑出来,此时⼩明需要付出总共为这些猫的体重的代价。例如,现在⼩明有三只红⾊的猫,体重分别为1,2,3,还有两只蓝⾊的猫,体重分别为 7,8 。此时如果⼩明声明的颜⾊是红⾊,那么所有红⾊的猫会出来,⼩明需要⽀付的代价为 6 。如果⼩明声明的颜⾊是蓝⾊,那么所有蓝⾊的猫会出来,⼩明需要⽀付的代价为 15

  • 2.对于现在出来的这些猫,⼩明选择其中的⼀部分,将他们染成⼀种新的颜⾊。然后放回所有的猫。

初始时所有猫都是⽩⾊。现在⼩明想知道,如果想要使得这些猫两两颜⾊都不同,最少需要花费多 少代价。

输入格式

第一行一个整数 n,表示一共有 n 只猫,接下来一行 n 个数 ai 意义如题所示

输出格式

输出⼀⾏⼀个整数表示最⼩代价

数据范围

1

样例输入

4 
6 7 70 25

样例输出

159

算法分析

一开始的想法是将猫的代价从大到小排序,然后每次挑出最大代价的猫去染色,但是这个算法对于样例输入的代价6,7,70,25是可行的,但是如果除去最大代价的剩下的猫的代价,要比最大猫的代价更大,那这个算法就不能保证最小代价

例如:69,70,71,72

2

可以观察发现,这是一颗哈夫曼树,也就是说这道题应该从小问题考虑到总体,而不是从整体模拟选猫的过程

解题代码

#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

//优先队列模拟哈夫曼树
priority_queue<long long , vector<long long>, greater<long long>> head;
int n;
int a[100005];

int main()
{
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
        head.push(a[i]);
    }
    
    long long sum = 0;
    for(int i = 0; i < n - 1; i++){
        long long a = head.top();
        head.pop();
        long long b = head.top();
        head.pop();
        
        long long c = a + b;
        sum += c;	//每个分支节点就是要加和的权重
        head.push(c);
    }
    
    cout << sum << endl;
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

省下洗发水钱买书

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

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

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

打赏作者

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

抵扣说明:

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

余额充值