撿石子---貪心算法(huffman)

撿石子---貪心算法(huffman)

問題 E: 撿石子

時間限制: 1 Sec  內存限制: 128 MB
提交: 49  解決: 31
[提交][狀態][討論版]

題目描述

在一個圓形操場的四周擺放着 n堆石子。 現要將石子有次序地合併成一堆。 規定每次選2 堆石子合併成新的一堆,合併的費用爲新的一堆石子數。試設計一個算法,計算出將 n堆石子合併成一堆的最小總費用。

輸入

輸入數據第1行有1個正整數 n(1≤n≤1000),表示有 n堆石子,每次選2堆石子合併。第2行有 n個整數, 分別表示每堆石子的個數(每堆石子的取值範圍爲[1,1000]) 。

輸出

數據輸出爲一行, 表示對應輸入的最小總費用。

樣例輸入

7
45 13 12 16 9 5 22

樣例輸出

313

提示

 


 中南大學計算機&軟件複試QQ羣552889929

 

[提交][狀態]

 

 

#include <stdio.h>
#include <stdlib.h>
 
int cmp(const void *a,const void *b)
{
  return(*(int *)b-*(int *)a);  //實現的是降序排序
}
 
int main(int argc, char *argv[])
{
  //哈夫曼樹的應用
  int n;
  int a[1005],i,j,sum;
  while(scanf("%d",&n)!=EOF){
      for(i=0;i<n;i++)
       scanf("%d",&a[i]);
 
     for(i=0,sum=0;i<n-1;i++)
     {
        qsort(a,n-i,sizeof(a[0]),cmp);
//        for(j=0;j<n;j++)
//            printf("%d ",a[j]);
//           printf("\n");
        a[n-2-i]=a[n-1-i]+a[n-2-i];//每次合併最小的兩個
        if(n-2-i>-1)
        sum+=a[n-2-i];
//        if(n - 2 - i == 0) break;
//        printf("sum = %d\n", sum);
 
//         printf("sum = %d\n",sum);
     }
//     sum += (a[0] + a[1]);
     printf("%d\n",sum);
 
 
  }
 
  //system("PAUSE");
  return 0;
}
 
/**************************************************************
    Problem: 1187
    User: xiaxiany
    Language: C++
    Result: 正確
    Time:14 ms
    Memory:1084 kb
****************************************************************/

 

posted on 2017-03-07 14:48 yun_ 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章