• SGU 203 Hyperhuffman


    题意:构造哈夫曼数,求出其中产生节点值的和

    解题思路:裸优先队列(最小堆),渣渣只会堆

    解题代码:

      1 // File Name: c.cpp
      2 // Author: darkdream
      3 // Created Time: 2013年09月04日 星期三 14时50分35秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #include<limits.h>
     25 #define  maxn  500005
     26 using namespace std;
     27 
     28 long long len, heapsize,a[maxn];
     29 long long LEFT(long long i )
     30 {
     31   return i*2;
     32 }
     33 long long RIGHT(long long i )
     34 {
     35    return i*2 +1;
     36 }
     37 long long PARENT(long long i )
     38 {
     39    return i/2;
     40 }
     41 void MIN_HEAPIFY(long long A[],long long i)
     42 {
     43   long long l = LEFT(i);
     44   long long r = RIGHT(i);
     45   long long fewest;
     46   if( l<= heapsize && A[l] < A[i])
     47       fewest = l;
     48   else fewest = i;
     49   if(r <= heapsize && A[r] < A[fewest])
     50       fewest = r;  //找出本节点以及其儿子节点最小的值的编号
     51   if(i != fewest)
     52     {
     53       long long temp = A[i];
     54       A[i] = A[fewest];
     55       A[fewest] = temp;
     56       MIN_HEAPIFY(A,fewest);//子树可能交换后不保持性质,使起保持性质
     57     }
     58 
     59 }
     60 void BUILD_MIN_HEAP(long long A[])
     61 {
     62    heapsize = len;
     63    //for(long long i = len/2 ;i >= 1;i --)
     64      // MIN_HEAPIFY(A,i);
     65 }
     66 long long HEAP_EXTRACT_MIN(long long A[])
     67 {
     68    long long MIN = A[1];
     69    A[1] = A[heapsize];
     70    heapsize = heapsize - 1;
     71    MIN_HEAPIFY(A,1);
     72    return MIN;
     73 }
     74 void HEAP_INCREASE_KEY(long long A[],long long i,long long key)
     75 {
     76   A[i] = key;
     77   while(i > 1 && A[PARENT(i)] > A[i] )
     78    {
     79      long long temp = A[PARENT(i)];
     80      A[PARENT(i)] = A[i];
     81      A[i] = temp;
     82      i = PARENT(i);
     83    }//向上更新
     84 
     85 }
     86 void MIN_HEAP_INSERT(long long A[],long long key)
     87 {
     88     heapsize = heapsize +1;
     89     A[heapsize] = INT_MAX;
     90     HEAP_INCREASE_KEY(A,heapsize,key);
     91 }
     92 int main(){
     93    //freopen("/home/plac/problem/input.txt","r",stdin);
     94    //freopen("/home/plac/problem/output.txt","w",stdout);
     95    long long t ; 
     96    scanf("%lld",&t);
     97    while(t--)
     98    {
     99       memset(a,0,sizeof(a));
    100       scanf("%lld",&len);
    101       for(long long i = 1;i <= len;i ++)
    102           scanf("%lld",&a[i]);
    103       BUILD_MIN_HEAP(a);
    104       long long sum = 0 ;
    105       for(long long i = 1;i <= len - 1;i ++)
    106       {
    107         long long tsum = HEAP_EXTRACT_MIN(a) + HEAP_EXTRACT_MIN(a); 
    108         sum += tsum;
    109         MIN_HEAP_INSERT(a,tsum);
    110       }
    111       printf("%lld
    ",sum);
    112       if(t!= 0 )
    113           printf("
    ");
    114    }
    115 
    116 return 0;
    117 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    2.pt-table-checksum工具
    Mysql8.0新特性01
    12.redis 之阅读大佬文章随笔
    4.Mysql之Mysqldump命令
    5. 关于高负载服务器Kernel的TCP参数优化
    Mysql Oracle 备份表数据、批量删除表数据
    Mysql limit用法
    Java 字符串数组转字符串
    Layui 自定义年份下拉框并且可输入
    Mysql 生成UUID
  • 原文地址:https://www.cnblogs.com/zyue/p/3304164.html
Copyright © 2020-2023  润新知