撿石子---貪心算法(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 ****************************************************************/