解题思路:

按照题目的要求解题,简单明了,易懂!

360截图17430811356850.png

这个就是我们的解题思路,就是不断的把最小的两个数找出来,然后加在一起,把这两个数存在一个数组中,同时把以前的两个最小的数用这个数替换掉,然后用递归的思路做,直到最后只剩下一个数为止。

运用到的东西

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;
}


点赞(10)
 

0.0分

12 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 9 条评论

兜兜里有糖 4年前 回复TA
@我写代码不用手 妙
我写代码不用手 4年前 回复TA
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

int main(){
	int n;
	cin>>n;
	int * q = (int*)malloc(10000*sizeof(int));
	int front = 0,rear = 0;
	for(int i=0;i<n;i++){
		cin>>q[rear++];
	}
	sort(q,q+n);
	int sum = 0; 
	while(front!=rear-1){
		int temp = q[front++]+q[front];
		q[front] = temp;
		sum = sum + temp;
		sort(q,q+n);
	}
	printf("%d",sum);
}
我是个新手,写的不好别见怪哈,有什么建议大家尽管提
早睡怪人dw 4年前 回复TA
妙啊
pingfan443 5年前 回复TA
受教了
c晨光 5年前 回复TA
@菜鸟啊 这就尴尬啦,英语是不好,不过这种问题。。。主要还是打的太快了,哈哈哈哈。。。不打算改了,咳咳
菜鸟啊 5年前 回复TA
楼主英语...compare写错啦
c晨光 6年前 回复TA
@验题君 真的是传说中的验题君吗,,,咳咳,给个优质解答呗,,,,
c晨光 6年前 回复TA
@验题君 大佬,带我这个菜鸟飞不
验题君 6年前 回复TA
up