对于每切一次,都会产生两个字段,其过程为一个二叉树。而要使中的代价最小,与huffman编码是一个道理。
因此可以以长度为权值,构建代价最小的huffman树。实现过程一些技巧,用f表示最小的下标,e为次小。
每合并一次,总数减一。
/*
poj 3253
*/
#include <stdio.h>
#include <string.h>
int a[20020];
long long ans=0;
int n;
void swap(int &a,int &b)
{
int t;
t=a;
a=b;
b=t;
}
void solve()
{
int f,e;
while(n>1)
{
f=0,e=1;
if(a[f]>a[e]) swap(f,e);
for(int i=2;i<n;i++)
{
if(a[i]<a[f])
{
e=f;f=i;
}
else if(a[i]<a[e])
e=i;
}
int t=a[f]+a[e];
ans+=t;
if(f==n-1) swap(f,e);
a[f]=t;
a[e]=a[n-1];
n--;
}
printf("%lld\n",ans );
}
int main(int argc, char const *argv[])
{
freopen("input","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",a+i);
solve();
return 0;
}