美文网首页
哈夫曼编码例题

哈夫曼编码例题

作者: Vincy_ivy | 来源:发表于2019-05-10 21:49 被阅读0次

找到最小的和次小的相加


1.Fence Repair

第一种做法:按照白书所说用树的方法

   //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int l[20001],n;
int main(){
//      freopen("data","r",stdin);

    while(scanf("%d",&n)!=EOF){ 
    long long int ans=0;
    for(int i=0;i<n;i++)
        scanf("%d",&l[i]);
        while(n>1){                     
            //求出最短min1,次短min2 
            int min1=0,min2=1;
            if(l[min1]>l[min2])
                swap(min1,min2);
            for(int i=2;i<n;i++)
            {
                if(l[min1]>l[i]){
                    min2=min1;
                    min1=i;
                }
                else if(l[min2]>l[i])
                    min2=i;
            }
            //合并 
            int t=l[min1]+l[min2];
            ans+=t;
            if(min1==n-1)
                swap(min1,min2);
            l[min1]=t;
            l[min2]=l[n-1];//没有用的
            //因为最终要更改的是min1,一行里面的数会越缩越小,所以要逐渐的舍弃最后一个; 
            n--;    
        }
        printf("%lld\n",ans);
    }
    return 0;
}

第二种做法:采用某某火最不会的优先队列:定义一个从小到大排列的优先队列,答案累加记录它们的和,知道优先队列剩下最后一个元素//这个代码工作量少挺多的
顺便补一补优先级队列//再完全不会的情况下,具体的嘛,就去看看优先队列的简书,比赛打完后在整理一下叭

  • priority_queue<int> qi;//普通的优先级队列,按从大到小排序
  • priority_queue<int, vector<int>, greater<int> > qi2;//从小到大的优先级队列,可将greater改为less,即为从大到小

 

代码

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long ll;
using namespace std;
priority_queue<int,vector<int>,greater<int> > que;//从小到大 
ll n,ans;
int main(){
//      freopen("data","r",stdin);
    cin>>n;
    ll l;
    for(int i=0;i<n;i++){
        cin>>l;
        que.push(l);//先进先出 
    }
    while(que.size()>1){
        ll x=que.top();
        que.pop();
        ll y=que.top();
        que.pop();
        ans+=x+y;
        que.push(x+y);
    }
    cout<<ans<<endl;
    return 0;
}

 

Hyperhuffman

There is a blank line between input blocks.这句话就是个坑,blocks就是T

代码

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long ll;
using namespace std; 
ll n,ans;
int main(){
//  freopen("data","r",stdin);
    int T;
    cin>>T;
    for(int j=0;j<T;j++)
    {
        cin>>n;
        ll l;
        ans=0;
        priority_queue<ll,vector<ll>,greater<ll> > que;//从小到大
        for(int i=0;i<n;i++){
            cin>>l;
            que.push(l);//先进先出 
        }
        while(que.size()>1){
            ll x=que.top();
            que.pop();
            ll y=que.top();
            que.pop();
            ans+=x+y;
            que.push(x+y);
        }
        cout<<ans<<endl;
        if(j<T-1)
            cout<<endl;
    }
    return 0;
}

相关文章

网友评论

      本文标题:哈夫曼编码例题

      本文链接:https://www.haomeiwen.com/subject/zssknqtx.html