本题基于插入排序,不过用了STL容器set来做存储,因此插入结点成了O(logn)时间,总的时间复杂度大概到O(nlogn),利用了set的排序性质,省去了写二叉树的麻烦,起初用的n^2的扫描和快排后左右扫描的算法都不见理想.
#include
<
stdio.h
>
#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;
}
#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;
}