AC代码如下:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=201314; int main() { int n,a[maxn]; while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; long long ans=0; while(n>1) { int min1=0,min2=1; if(a[min1]>a[min2]) swap(min1,min2); for(int i=2;i<n;i++) { if(a[i]<a[min1]) { min2=min1; min1=i; } else if(a[i]<a[min2]) min2=i; } int min_sum=a[min2]+a[min1];//将两块木头合成一块 if(min1==n-1)//保证min1不会等于n-1,以免赋值失败 swap(min1,min2); a[min1]=min_sum;//把合成的新值赋给a[min1] a[min2]=a[n-1];//因为n--,所以必须把a[n-1]给找个位置存放 ans+=min_sum;//总开销加一 n--;//木板数目减一 } cout<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/u014004096/article/details/43673657