本題基於插入排序,不過用了STL容器set來做存儲,因此插入結點成了O(logn)時間,總的時間複雜度大概到O(nlogn),利用了set的排序性質,省去了寫二叉樹的麻煩,起初用的n^2的掃描和快排後左右掃描的算法都不見理想.
#include<limits.h>
#include<set>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int*a=new int[n];
int i;
for(i=0;i<n;++i)
scanf("%d",&a[i]);
int sum=a[n-1];
multiset<int> SI;
multiset<int>::iterator pib,ite;
SI.insert(a[n-1]);
for(i=n-2;i>=0;--i)
{
pib=SI.insert(a[i]);
int min=INT_MAX;
ite=pib;
if(ite!=SI.begin())
min=a[i]-*(--ite);
ite=pib;
if(++ite!=SI.end())
{
int temp=*ite-a[i];
if(temp<min)
min=temp;
}
sum+=min;
}
printf("%d ",sum);
delete[]a;
}
return 0;
}