【机试备考】Day1——最小数、哈夫曼树

考研初试终于结束了!考研期间私信回的不及时还请大家见谅,如果考上一定写一篇经验贴

今天开始准备机试了,每天会记录一下做的题目,希望大家监督我坚持下去
 

题目1:找最小数

牛客网-BUPT2010第二题
第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x y。输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下y最小的。 (水题)

输入:
5  
3 3  
2 2  
5 5  
2 1  
3 6
输出:
2 1

 

代码

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int x,y;
    cin>>x>>y;
    int minx=x,miny=y;
    for(int i=1;i<n;i++)
    {
        cin>>x>>y;
        if(x<minx)
        {
            minx=x;
            miny=y;
        }
        else if(x==minx)
        {
            if(y<miny)
            {
                minx=x;
                miny=y;
            }
        }
    }
    cout<<minx<<" "<<miny;
}

 

题目2:哈夫曼树

牛客网-BUPT2010第四题
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和的最小值。
在这里插入图片描述

输入:
5  
1 2 2 5 9
输出:
37

 

分析

  • 个人觉得这道题说的有点不明白,可以理解为:先建一棵哈夫曼树,然后求所有非叶结点的值的和
  • 关键是每次如何找最小的两个结点,就想到了用小顶堆,先将所有叶子结点的权值都排到堆里,然后输出两个堆顶元素(相当于建树时连接两个最小权值的结点),将他们之和再插入到堆里,重复该过程,直到堆为空
  • 关于小顶堆的实现,可以利用优先队列 priority_queue(不得不说,考完初试以后,能用库函数的感觉真爽!)
     

代码

#include<iostream>
#include<queue>
using namespace std;
int main()
{
    int n,a,b;
    priority_queue<int,vector<int>,greater<int> > minHeap;
    while(cin>>n)
    {
        int temp;
        int res=0;//结果
        for(int i=0;i<n;i++)//输入叶子节点权值
        {
            cin>>temp;
            minHeap.push(temp);
        }
        while(minHeap.size()!=1)
        {
            //输出两个堆顶元素
            a=minHeap.top();
            minHeap.pop();
            b=minHeap.top();
            minHeap.pop();
            //更新res
            res+=a+b;
            //新节点的值插入堆中
            minHeap.push(a+b);
        }
        cout<<res<<endl;
        minHeap.pop();
    }
}

最近还要肝课设,先做两道试试水,明天继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值