POJ3253

本文介绍了一种使用小根堆进行排序并求解特定问题的算法实现。该算法首先通过堆排序将输入的数据进行排序,然后通过不断取出最小值并进行特定操作来解决一个未具体说明的问题,最后输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <stdio.h>
#include <string.h>


#define maxn 20000


using namespace std;


int l[maxn];
int n,h;
long long int minx;


long long int ans;


void heap_sort( int x)//小根堆
{
    int lg, lr, t;
    while( (x<<1) <= h)
    {
        lg = x << 1;
        lr = ( x << 1) + 1;
        if( lr <= h && l[lg] > l[lr])
         lg = lr;
        if( l[x] > l[lg])
        {
             t = l[x];
             l[x] = l[lg];
             l[lg] = t;
             x = lg;
        }
        else
        break;
    }
    return ;
}


int main()
{
    int i;
    while( 1 == scanf("%d",&n))
    {
        for( i = 1; i<=n; i++)
         scanf("%d",&l[i]);


         h = n;
         for( i = n/2; i > 0 ; i--)//堆排序
          heap_sort(i);


        ans = 0;


        while( h > 1)//去顶端堆
        {
            minx = l[1];
            l[1] = l[h];


            h--;
            heap_sort(1);


            minx += l[1];
            l[1] = minx;
            heap_sort(1);


            ans += minx;
        }


        printf("%I64d\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值