考研初试终于结束了!考研期间私信回的不及时还请大家见谅,如果考上一定写一篇经验贴
今天开始准备机试了,每天会记录一下做的题目,希望大家监督我坚持下去
题目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();
}
}
最近还要肝课设,先做两道试试水,明天继续