1167. barras de conexión de menor coste

título Descripción

Para decorar la casa, es necesario procesar parte de la longitud de la barra es una palos enteros positivos.
Si desea longitudes de X e Y son dos barras juntos, usted tiene que pagar el costo de X + Y. Debido a las necesidades de construcción, usted tiene que conectar todos los bares en una sola.
Que devuelva el menor costo para todos los palos bares juntos en una necesidad. Observe que puede elegir el orden de la conexión de la barra.
Ejemplo 1:
Entrada: palos = [2,4,3]
de salida: 14
Explicación: 2 y 3 están conectados a la primera 5, se tarda 5; y luego 5 9 4 conectados; coste total de 14.
Ejemplo 2:

De entrada: palos = [1,8,3,5]
de salida: 30

Hacer una Oferta El:
1 <= sticks.length <= 10 ^ 4
1 <= palos [i] <= 10 ^ 4

pensamiento

Coste por selección menos dos restantes biela, considere la cola de prioridad - min-montón resuelto.

#include <stdlib.h>
#include <stdio.h>
#define MinData 0;
typedef int ElementType;
typedef struct HNode{
    ElementType *data;
    int size;
    int capacity;
}*Heap;
typedef Heap MinHeap;

MinHeap CreateHeap(int size){
    MinHeap heap = (MinHeap)malloc(sizeof(struct HNode));
    heap->data = (ElementType *)malloc(sizeof(ElementType)*(size+1));
    heap->size = 0;
    heap->capacity = size;
    heap->data[0] = MinData;
    return heap;
}

void InsertMinHeap(MinHeap heap, ElementType x){
    if(heap->size == heap->capacity)
        return;
    int pos = ++heap->size;
    for(; heap->data[pos/2]>x; pos/=2){
        heap->data[pos] = heap->data[pos/2];
    }
    heap->data[pos] = x;
}

ElementType DeleteFromMinHeap(MinHeap heap){
    if(heap->size==0){
        return heap->data[0];
    }
    int top = heap->data[1];
    int last = heap->data[heap->size--];
    int parent,child;
    for(parent=1; parent*2<=heap->size;parent=child){
        child = parent*2;
        if(child!=heap->size&&heap->data[child]>heap->data[child+1]){
            child++;
        }
        if(last>heap->data[child]){
            heap->data[parent]=heap->data[child];
        }
        else {
            break;
        }
    }
    heap->data[parent]=last;
    return top;
}

int connectSticks(int* sticks, int sticksSize){
    int x1,x2,cost=0,sum=0;
    MinHeap heap= CreateHeap(sticksSize);
    for(int i=0;i<sticksSize;i++){
        InsertMinHeap(heap,sticks[i]);
    }
    while(heap->size!=0){
        x1=DeleteFromMinHeap(heap);
        cost=x1;
        if(heap->size==0){
            break;
        }
        else{
            x2=DeleteFromMinHeap(heap);
            cost+=x2;
            InsertMinHeap(heap,cost);
            sum+=cost;
        }
    }
    return sum;
}

Supongo que te gusta

Origin www.cnblogs.com/wangcl97/p/12500837.html
Recomendado
Clasificación