题目来源:点击---------------------------------------------链接
解题思路:
按照题目的要求解题,简单明了,易懂!
这个就是我们的解题思路,就是不断的把最小的两个数找出来,然后加在一起,把这两个数存在一个数组中,同时把以前的两个最小的数用这个数替换掉,然后用递归的思路做,直到最后只剩下一个数为止。
运用到的东西
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的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!II)Sort函数有三个参数:
- 第一个是要排序的数组的起始地址。
- 第二个是结束的地址(最后一位要排序的地址)
- 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
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 > usingnamespace 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++标准库强大的功能完全可以解决这种麻烦。
Sort函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则
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; }
《以》《下》《是》《我》《的》《闲》《扯》《,》《不》《要》《在》《意》《。》(┬_┬)
个人以前喜欢刷题,可以看一下下面这个图:
不过好久都没刷了,刚刚看到的心仪的学校很看重编程,决定重新拾起宝刀,在代码的世界,编程的世界,打下一片属于自己的天下,哎,老久不看,排名下降的厉害。。。上面还写了23篇文章,这个是从我那里面复制过来的,以后打算在dotcpp以及力库(┬_┬)网上偶尔刷刷题,陶怡一下情操。坚持更新博客。
力库才申请的。。。
可爱的大Q宝。
分类很棒!