1 solutions

  • 0
    @ 2024-12-10 21:47:36

    C :

    #include <stdio.h>
    #include <stdlib.h>
    
    int *input(int n)
    {
    	int *T, *p;
    	int i = 0, j = 0, temp, pos;
    	T = (int*) malloc(sizeof (int) * (n));
        for (i = 0; i < n; i++)
        {
    		p = T;
            scanf("%d", &temp);
    		for (j = 0; j < i; j++)
    		{
    			if(*p < temp)
    				break;
    			p++;
    		}
    		pos = j;
    		for (j = i; j > pos; j--)
    		{
    			*(T + j) = *(T + j - 1);
    		}
    		*(T + j) = temp;
        }
    	return T;
    }
    int huffman(int *T, int n)
    {
    	int *p;
    	int j = 0, pos, cost;
    	cost = *(T + n - 1) + *(T + n - 2);
    	p = T;
    	for (j = 0; j < n - 2; j++)
    	{
    		if(*p < cost)
    			break;
    		p++;
    	}
    	pos = j;
    	for (j = n - 2; j > pos; j--)
    	{
    		*(T + j) = *(T + j - 1);
    	}
    	*(T + j) = cost;
    	return cost;
    }
    int main(void)
    {
        int i = 0, n = 0, l = 0, cost = 0;
    	int *T;
    	scanf("%d", &n);
        T = input(n);
    	for (l = n; l > 1; l--)
        {
    		cost += huffman(T, l);
        }
    	printf("%d\n", cost);
        return 0;
    }
    
    

    C++ :

    #include<iostream>
    using namespace std;
    
    int sum = 0;
    
    int main()
    {
    	int N;
    	cin >> N;
    	int *num = new int[N];
    	for(int i = 0; i < N; i++)
    	{
    		cin >> num[i];
    	}
    	int min = 0;
    	int min_d = 0;
    	int min_mid = 0;
    	int min_dmid = 0;
    	for(int count = N; count > 1; count--)
    	{
    		min_mid = 0;
    		min_dmid = 0;
    		for(int i = 0; i < N; i++)
    		{
    			if((num[i] != 0) && (num[i] < num[min]))
    			{
    				min = i;
    			} 
    		}
    		//令mid_d为不等于min的一个值,排除num[min]后求剩下的元素最小值 
    		for(int i = 0; i < N; i++)
    		{
    			if((num[i] != 0) && (i != min)) 
    			{
    				min_d = i;
    				break; 
    			}
    		}
    		for(int i = 0; i < N; i++)
    		{
    			if(i == min) continue;
    			else
    			{
    				if((num[i] != 0) && (num[i] < num[min_d]))
    				{
    					min_d = i;
    				}
    			}
    		} 
    		min_dmid = num[min_d];//因为相加后就得将改坐标删除,所以用两个中间变量记录两个最小值 
    		min_mid = num[min];
    	    num[min_d] = 0;
    		num[min] = min_mid + min_dmid;
    		sum += num[min];
    	}
    	cout << sum << endl;
    	delete [] num;
    	return 0;
    }
    
    • 1

    【设计型】第11章:指针和数组 Huffuman树(1)

    Information

    ID
    491
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By