Description
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
分析:
一道机智题而已,只要每次把最小的两个数相加,然后将得到的和放进原数组中每次得到的和加起来就可以了。就是一个循环每操作一次排序一次。其实想到这个挺容易的,但是说服自己很难啊,就总是觉得这样想会有什么漏洞,为什么两个小的相加就可以了,总是想用严格的方法证明出来说服自己。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL A[5005];
int main()
{
// freopen("in.txt","r",stdin);
LL n,pos;
LL ans;
while(~scanf("%lld",&n)&&n){
memset(A,0,sizeof(A));
for(LL i=0;i<n;++i){
scanf("%lld",&A[i]);
}
pos=0;ans=0;
for(int i=0;i!=n-1;++i){
sort(A+pos,A+n);
ans+=A[pos]+A[pos+1];
A[pos+1]+=A[pos];
++pos;
}
printf("%lld\n",ans);
}
return 0;
}
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////