| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我的ac代码,纯c 16ms 共同学习#include "stdio.h"
#include "stdlib.h"
#define Swap(a,b) a=a+b;b=a-b;a=a-b
void Shift(__int64 *heap,int j,int n)
{
int i;
int MinSon;
heap[0]=heap[j];
for(i=j;i<=n/2;)
{
MinSon=i*2;
if(MinSon!=n&&heap[MinSon]>heap[MinSon+1])
{
MinSon++;
}
if(heap[i]>heap[MinSon])
{
heap[i]=heap[MinSon];
i=MinSon;
heap[i]=heap[0];
}
else break;
}
heap[i]=heap[0];
}
void Insert(__int64 *heap,__int64 x,int n)
{
heap[n]=x;
for(int i=n;i/2>0;i=i/2)
{
if(heap[i]<heap[i/2])
{
Swap(heap[i],heap[i/2]);
}
}
}
void Minheap(__int64 *heap,int n)
{
int i;
for(i=n/2;i>0;i--)
{
Shift(heap,i,n);
}
}
__int64 MinCost(__int64 *heap,int n)
{
__int64 sum=0;
Minheap(heap,n);
for(int i=n;i>1;i--)
{
if(i==2)
{
sum+=heap[1]+heap[2];
break;
}
Swap(heap[1],heap[i]);
Shift(heap,1,i-1);
Swap(heap[1],heap[i-1]);
Shift(heap,1,i-2);
sum+=heap[i]+heap[i-1];
Insert(heap,heap[i]+heap[i-1],i-1);
}
return sum;
}
int main()
{
int n;
__int64 *heap;
scanf("%d",&n);
heap=(__int64 *)malloc((n+1)*sizeof(__int64));
heap[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%I64d",heap+i);
}
printf("%I64d\n",MinCost(heap,n));
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator