POJ 3253 Fence Repair

解题思路:基于最小堆实现Haffman

NULL
   
     
#include < iostream >
using namespace std;
int n,plank[ 20001 ];
void heapAdjust( int s)
{
int i,exp;
for (i = s;i <= (n / 2 );)
{
exp
= ((i * 2 + 1 ) <= n && plank[i * 2 + 1 ] < plank[i * 2 ]) ? 1 : 0 ;
if (plank[i] > plank[i * 2 + exp])
swap(plank[i],plank[i
* 2 + exp]),i = i * 2 + exp;
else break ;
}
}

int main()
{
int i,t;
__int64 ans
= 0 ;
scanf(
" %d " , & n);
for (i = 1 ;i <= n;i ++ )scanf( " %d " , & plank[i]);
for (i = n / 2 ;i >= 1 ;i -- )heapAdjust(i);
while (n > 1 )
{
t
= plank[ 1 ];plank[ 1 ] = plank[n];n -- ;
heapAdjust(
1 );
t
+= plank[ 1 ];plank[ 1 ] = t;
heapAdjust(
1 );
ans
+= t;
}
printf(
" %I64d\n " ,ans);
return 0 ;
}

 

你可能感兴趣的:(AIR)