2015-05-25 4 views
0

Это вопрос от OJ PATПуть в Heap занимает слишком много времени

Вставьте последовательность заданных чисел в первоначально пустой мин кучного H. Тогда для любого заданного индекса I, вы должны напечатайте путь от H [i] до корня.

Однако мой код всегда тайм-аут, т. Е. Требуется слишком много времени. Как его решить?

main() 
{ 
    int i,*a,n,m,k,data; 
    scanf("%d%d",&n,&m); 
    a=malloc(n*sizeof(int)); 
    a[0]=-10001; // 
    for(i=1;i<=n;i++) 
    { 
     scanf("%d",&data); 
     heapAdjust(a,data); 
    } 

    for(i=1;i<=m;i++) 
    { 
     scanf("%d",&k); 
     printf("%d",a[k]); 
     k=k/2; 
    while(1) 
    { 
     printf(" %d",a[k]); 
     if(k==1) 
      break; 
     k=k/2; 
    } 
    printf("\n"); 
    } 
    free(a); 
} 
void heapAdjust(int a[],int data) // make heap 
{ 
    static int size=0; 
    int i; 
    i=++size; 
    for(;a[i/2]>data;i=i/2) 
     a[i]=a[i/2]; 
    a[i]=data; 
} 
+0

Если корень находится в 'a [1]', вам необходимо сделать свой размер массива 'n + 1'. –

ответ

1

Вы, вероятно, работает в бесконечном цикле, потому что k обращается в нуль в некоторой точке.

Попытайтесь изменить состояние break внутри цикла while(1) от k == 1 до k <= 1 и посмотреть, поможет ли это.

+1

Фактически, 'k' перейдет к 0, если входной сигнал' 1' (т. Е. Они запрашивают путь от корня). Легко решается, если вы замените 'while (1)' на 'while (k> 0)'. Упрощает и код. –

Смежные вопросы