Advertisement

5-12 修理牧场 (25分)——最小堆->哈夫曼树+快速排序

阅读量:

think:
1通过最小堆生成哈夫曼树+快速排序

5-12 修理牧场 (25分)

编写一个程序来帮助农夫计算如何以最小成本将木材分割成所需的NN段

输入随后表示为正整数 NNN(不大于 104)。接着要求将木头锯成 NNN 块。然后第二行则表示 NNN 个不超过 50 的正整数值。

输出格式:
输出一个整数,即将木头锯成NNN块的最少花费。

输入样例:
8
4 5 1 2 1 3 1 1

输出样例:

49

Hint:

复制代码
    测试点1    答案正确    12/12   1   1   sample
    测试点2    答案正确    1/1     2   1   只有一段木头,不用锯
    测试点3    答案正确    6/6     5   1   最大N,最长木段,输出的最大值
    测试点4    答案正确    6/6     6   1   最大N随机数据

以下为答案正确代码

复制代码
    #include <stdio.h>
    #include <stdlib.h>
    #define MINDATA -1
    typedef struct node
    {
    int *Data;
    int Size;
    }MinHeap;
    MinHeap * Creat(int MaxSize)
    {
    MinHeap *H = (MinHeap *)malloc(sizeof(MinHeap));
    H->Data = (int *)malloc((MaxSize + 1)*sizeof(int));
    H->Size = 0;
    H->Data[0] = MINDATA;
    return H;
    }
    void Insert(MinHeap *H, int x)
    {
    int i = ++H->Size;
    for(; H->Data[i/2] >= x; i /= 2)
        H->Data[i] = H->Data[i/2];
    H->Data[i] = x;
    }
    int Delete(MinHeap *H)
    {
    int MinItem, X, parent, child;
    MinItem = H->Data[1];
    X = H->Data[H->Size--];
    for(parent = 1; parent*2 <= H->Size; parent = child)
    {
        child = parent*2;
        if((child != H->Size) && H->Data[child] > H->Data[child+1])
            child++;
        if(X <= H->Data[child])
            break;
        else
            H->Data[parent] = H->Data[child];
    }
    H->Data[parent] = X;
    return MinItem;
    }
    void PercDown(MinHeap *H, int p)
    {
    int X, parent, child;
    X = H->Data[p];
    for(parent = p; parent*2 <= H->Size; parent = child)
    {
        child = parent*2;
        if((child != H->Size) && H->Data[child] > H->Data[child+1])
            child++;
        if(X <= H->Data[child])
            break;
    }
    H->Data[parent] = X;
    }
    void GetBuild(MinHeap *H)
    {
    for(int i = H->Size/2; i > 0; i--)
    {
        PercDown(H, i);
    }
    }
    int cmp(const void *a, const void *b)
    {
    return ((*(int *)a) - (*(int *)b));
    }
    int main()
    {
    int n, i, x1, x2, sum, y, ans[14000];
    MinHeap *H1;
    while(scanf("%d", &n) != EOF)
    {
        sum = 0;
        H1 = Creat(n);
        H1->Size = n;
        for(i = 1; i <= n; i++)
        {
            scanf("%d", &ans[i]);
        }
        qsort(&ans[1], n, sizeof(ans[1]), cmp);
        for(i = 1; i <= n; i++)
        {
            H1->Data[i] = ans[i];
        }
        GetBuild(H1);
        for(i = 0; i < n-1; i++)
        {
            x1 = Delete(H1);
            x2 = Delete(H1);
            y = x1 + x2;
            sum += y;
            Insert(H1, y);
        }
        printf("%d\n", sum);
    }
    }

全部评论 (0)

还没有任何评论哟~