解题思路:
按照题目的要求解题,简单明了,易懂!
这个就是我们的解题思路,就是不断的把最小的两个数找出来,然后加在一起,把这两个数存在一个数组中,同时把以前的两个最小的数用这个数替换掉,然后用递归的思路做,直到最后只剩下一个数为止。
运用到的东西
1》数组a
这里的数组a可以理解是动态数组,数组的长度是在减少的
因为我们总是把数组a中的最小的两个值加在一起,然后替换掉这两个值
把加在一起的值存到数组b里面去
2》数组b,存储数组a中的值,其实这里的数组b是可以不要的,要着主要是方便理解这个过程
3》累加的sum,这里的累加的使用其实就是求最后的权值,累加的值是数组b中的值
4》STL中的sort排序函数//个人比较懒,直接就用这个排序函数了
关于sort函数的使用在参考代码的下面有
注意事项:
注意数组的长度在改变,循环一次,长度减少一个,原因就是最小的两个数合在一起了,长度自然就减少了
个人理解
1》这个题目其实用队做是更好的
2》哈夫曼树的权值的计算我一直都是画成树再用路径来算的,这种想法是非常的狭隘的,如果这个题目构造成树再来解的话会非常的麻烦。
因而可见对一个知识的理解的深度是相当重要的,不然会很吃亏d(╯﹏╰)b 咕~~
参考代码:
#include <iostream> #include <algorithm> bool complare(int a,int b) { return a>b; } using namespace std; int main(int argc, char *argv[]) { int length; cin>>length; int a[length]; for(int i=0;i<length;i++) cin>>a[i]; int n=length-1,b[n],sum=0; for(int j=0;j<n;j++) { sort(a,a+length,complare); b[j]=a[length-1]+a[length-2]; sum+=b[j]; length--; a[length-1]=b[j]; } cout<<sum; return 0; }
C++sort()函数的用法
近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧!
(一)为什么要用c++标准库里的排序函数
Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!
(二)c++标准库里的排序函数的使用方法
I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!II)Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
Sort函数使用模板:
Sort(start,end,,排序方法)
下面就具体使用sort()函数结合对数组里的十个数进行排序做一个说明!
例一:sort函数没有第三个参数,实现的是从小到大#include<iostream>#include<algorithm>using
namespace std;int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
例二
通过上面的例子,会产生疑问:要实现从大到小的排序肿么办?
这就如前文所说需要在sort()函数里的第三个参数里做文章了,告诉程序我要从大到小排序!
需要加入一个比较函数 complare(),此函数的实现过程是这样的
bool complare(int a,int b) { return a>b; }
这就是告诉程序要实现从大到小的排序的方法!#include<iostream>#include<algorithm>using
namespace std;bool complare(int a,int b) { return a>b; } int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,//这是规则 for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
例三:
通过上面例一、二的方法虽然实现了从大到小和从大到小的排序,这样做还是有点麻烦,因为还需要自己编写告诉程序进行何种排序的函数,c++标准库强大的功能完全可以解决这种麻烦。
Sortt函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则
less<数据类型>()//从小到大排序greater<数据类型>()//从大到小排序结合本例子,这样的就可以完成你想要的任何一种排序原则了
#include<iostream> #include<algorithm> using namespace std; int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,less<int>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; } #include<iostream> #include<algorithm> using namespace std; int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<int>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
例四:利用sort函数还可以实现对字符的排序,排序方法大同小异,下面就把程序范例展示一下
#include<iostream> #include<algorithm> using namespace std;int main() { char a[11]="asdfghjklk"; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<char>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
0.0分
12 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复