优先队列 合并

来源:互联网 发布:windows7服务优化说明 编辑:程序博客网 时间:2024/06/09 01:34

https://biancheng.love/problem/720/index

本题题目比较清晰,给定一列数,每次只合并两个数,并将这两个数相加得到的新数加入数组,并记录二数之和且依次累加。

本题其实就是一道优先队列问题,优先规则是每次取两个最小的数进行合并,并将其和加入原队列,而将两数从原队列删除。可以采用数组模拟这个优先队列,也以用数组构造一个最小堆,每次从堆中取出堆的第一个元素,并将其删除,再取出第二个元素,并将其删除,而将两数之和插入该最小堆,直至堆中取出第二个元素后,堆为空则停止循环

#include<cstdio>#include<algorithm>#include<iostream>using namespace std;int a[10001];int main(){    int n;    long long ans=0,ans1,sum=0;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&a[i]);    }    ans1=sum;    for(int i=0;i<n-1;i++)    {        //每次循环对数组索引为i后面的进行排序,然后求a[i]+a[i+1]之和ans1,并将ans1赋给a[i+1]直至循环结束,本方法效率较低,使用最小堆模拟可提高方法执行效率        sort(a+i,a+n);        ans1=a[i]+a[i+1];        ans+=ans1;        a[i+1]=ans1;    }    printf("%lld",ans);}
0 0
原创粉丝点击