Exemplo n.º 1
0
/*
 *用于求解子问题的递归函数
 */
int min_insert(char *str, int start, int end){
	if(start == end){
		return 0;
	}else if(end - start == 1){
		if(str[start] == str[end])
			return 0;
		else
			return 1;
	}

	if(str[start] == str[end]){
		return min_insert(str, start+1, end-1);
	}else{
		int a = min_insert(str, start+1, end);
		int b = min_insert(str, start, end-1);
		return (a > b ? b : a) + 1;
	}
}
Exemplo n.º 2
0
/*
 *求解str的最小插入字符数才能构成回文。
 */
int min_huiwen(char *str, int n){
	if(n <= 0){
		return -1;
	}
	return min_insert(str, 0, n-1); 
}
Exemplo n.º 3
0
int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */    
    
    int i,n,tmp,*max_heap,*min_heap,max_size=0,min_size=0;

    scanf("%d",&n);
    max_heap = malloc(sizeof(int) * n);
    min_heap = malloc(sizeof(int) * n);

    for (i=0;i<n;i++) {
        scanf("%d",&tmp);
        if (tmp < min_heap[0]) {
            //printf("max insert %d\n",tmp);
            max_insert(tmp,max_heap,max_size++);
        } else {
            //printf("min insert %d\n",tmp);
            min_insert(tmp,min_heap,min_size++);
        }

        //print_heap("max",max_heap,max_size);
        //print_heap("min",min_heap,min_size);

        if (i % 2 == 1) {
            if (min_size > max_size) {
                // swap min root to max heap
                //printf("move %d from min to max\n",min_heap[0]);
                tmp = min_heap[0];
                min_heap[0] = min_heap[min_size-1];
                min_heapdown(min_heap,--min_size,0);
                max_insert(tmp,max_heap,max_size++);
            } else if (max_size > min_size) {
                // swap max root to min heap
                //printf("move %d from max to min\n",max_heap[0]);
                tmp = max_heap[0];
                max_heap[0] = max_heap[max_size-1];
                max_heapdown(max_heap,--max_size,0);
                min_insert(tmp,min_heap,min_size++);
            }
        }

        print_heap("max",max_heap,max_size);
        print_heap("min",min_heap,min_size);

        if (i % 2 == 1) {
            // median is mean of min and max 0th elements
            printf("%.1f\n",(double)(min_heap[0]+max_heap[0])/2);
        } else {
            // median is 0th of largest heap
            if (max_size > min_size) {
                printf("%.1f\n",(double)max_heap[0]);
            } else {
                printf("%.1f\n",(double)min_heap[0]);
            }
        }
    }

    free(max_heap);
    free(min_heap);

    return 0;
}
Exemplo n.º 4
0
//Insertion in Median Heap
int insert_med(Heap H,int n,int x)
{
    
    int med = median(H,n);
    int j;
    
    if(x<=med)
    {
        if(H.size_max == n - H.size_min-1)
        {
            //Deletes root from max heap and inserts in the min heap
            //Inserts new element in the max heap

            int del = delete_max(H,n);
            H.size_max--;

            max_insert(H,x,n);
            H.size_max++;

            min_insert(H,del,n);
            H.size_min--;
            return 2;
        }
        else
        {
            //Inserts new element in the max heap
            max_insert(H,x,n);
            H.size_max++;
           
            return 1;
        }    
    }    

    else
    {
        if(H.size_max == n - H.size_min-1)
        {
            //Inserts new element in the min heap
            min_insert(H,x,n);
            H.size_min--;
          
            return 2;
        }
        else
        {
            //Deletes root from min heap and inserts in the max heap
            //Inserts new element in the min heap
            int del = delete_min(H,n);
            H.size_min++;

            max_insert(H,del,n);
            H.size_max++;

            min_insert(H,x,n);
            H.size_min--;
  
            return 1;
        }    
    }    


}