閱讀20 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【哈夫曼編碼】HDU2527-Safe Or Unsafe

Safe Or Unsafe
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1474    Accepted Submission(s): 582


Problem Description
Javac++ 一天在看計算機的書籍的時候,看到了一個有趣的東西!每一串字符都可以被編碼成一些數字來儲存信息,但是不同的編碼方式得到的儲存空間是不一樣的!並且當儲存空間大於一定的值的時候是不安全的!所以Javac++ 就想是否有一種方式是可以得到字符編碼最小的空間值!顯然這是可以的,因為書上有這一塊內容--哈夫曼編碼(Huffman Coding);一個字母的權值等於該字母在字符串中出現的頻率。所以Javac++ 想讓你幫忙,給你安全數值和一串字符串,並讓你判斷這個字符串是否是安全的?
 

Input
輸入有多組case,首先是一個數字n表示有n組數據,然後每一組數據是有一個數值m(integer),和一串字符串沒有空格隻有包含小寫字母組成!
 

Output
如果字符串的編碼值小於等於給定的值則輸出yes,否則輸出no。
 

Sample Input
2
12
helloworld
66
ithinkyoucandoit
 

Sample Output
no
yes
 

Source
HDU 2008-10 Programming Contest

 

 

 

 


題意:建完樹後,判斷下除了葉子結點之外的其他結點之和是否大於題目給出的數字。

建立哈夫曼樹的過程就是在集合中找出兩個最小值,兩者之和成一個新值,加入原來的集合中。。。。

優先隊列模擬建哈夫曼樹。。。。
AC代碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char a[1500];
int flag[27];
int main()
{
    int i,j,n,m,k,x,y,sum;
    scanf("%d",&n);
    while(n--)
    {
       scanf("%d",&m);
       memset(a,0,sizeof(a));
       scanf("%s",&a);
       k=strlen(a);
       memset(flag,0,sizeof(flag));
       for(i=0;i<k;i++)
       {
          flag[a[i]-'a']++;
       }
       
       priority_queue<int,vector<int>,greater<int> > q;
       for(i=0;i<26;i++)
       {
          if(flag[i]!=0)
          q.push(flag[i]);
       }
       sum=0;
       if(q.size()==1)
       {
          if(k>m)
          printf("no\n"); 
          else
          printf("yes\n");
       }
       else
       {
           while(q.size()>1)
           {
              x=q.top();q.pop();
              y=q.top();q.pop();
              sum+=(x+y);
              q.push(x+y);
           }
    
           if(sum<=m)
           printf("yes\n");
           else
           printf("no\n"); 
       }
    }
    return 0;   
}


這裏我打印出了樣例建立哈夫曼樹的過程:
3
12
helloworld
x=1 y=1 sum=2
x=1 y=1 sum=2
x=1 y=2 sum=3
x=2 y=2 sum=4
x=3 y=3 sum=6
x=4 y=6 sum=10
sum=27
no
66
ithinkyoucandoit
x=1 y=1 sum=2
x=1 y=1 sum=2
x=1 y=1 sum=2
x=1 y=2 sum=3
x=2 y=2 sum=4
x=2 y=2 sum=4
x=2 y=3 sum=5
x=3 y=4 sum=7
x=4 y=5 sum=9
x=7 y=9 sum=16
sum=54
yes

最後更新:2017-04-03 05:39:53

  上一篇:go 利用Fragment實現Tab頁
  下一篇:go 評分星星New Version