#include<cstdio>
template <typename Type>
class list
{
private:
struct node
{
Type data;
node *next;
};
node *h=new node,*p,*q;
int len=-1;
public:
Type index(int id)
{
int i;
p=h;
for(i=0;i<=id;++i)
{
p=p->next;
}
return p->data;
}
void set(int id,Type data)
{
int i;
p=h;
for(i=0;i<=id;++i)
{
p=p->next;
}
p->data=data;
}
void append(Type data)
{
int i;
p=h;
for(i=0;i<=len;++i)
{
p=p->next;
}
len++;
p->next=new node;
p=p->next;
p->next=NULL;
p->data=data;
}
void del(int index)
{
int i;
p=h;
for(i=0;i<index;++i)
{
p=p->next;
}
q=p->next;
p->next=q->next;
delete q;
}
int getlen()
{
return len;
}
};
int main()
{
list<unsigned long long> ls;
int i,j,n,r,min,ind;
unsigned long long ans=0;
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%d",&r);
ls.append(r);
}
for(i=0;i<n-1;++i)
{
min=1e9;
ind=-1;
for(j=0;j<n-1-i;++j)
{
if(ls.index(j)+ls.index(j+1)<min)
{
min=ls.index(j)+ls.index(j+1);
ind=j;
}
}
ls.del(ind);
ls.set(ind,min);
ans+=min;
}
printf("%llu",ans);
return 0;
}
码风有点凌乱哈
因为合并次数相同,大堆的要尽量少合并几次,每次选择和最小的两堆合并,经过n-1次合并累加得到答案