iinattr

GarsiaWachs

2022-07-24

GarsiaWachs

算法流程

1.找到满足 $q_{k-1} \lt q_{k+1}q$的最小下标 kk
2.找到满足$q_{j-1} \gt q_{k-1} + q_kq$的最大 $j \lt kj<k$
3.从列表中清除$q_{k-1}, q_kq$
4.在$q_{j-1}q$ 之后插入 $q_{k-1} + q_kq$
5.$q_{-1}$和$q_{n+1}$n+1可以用 \infty∞ 处理

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
using namespace std;
#define INF 0x7fffffff
vector<int> a;
int n,t,ans=0,k,j;
int main()
{
cin>>n;
a.push_back(INF);
for(int i=1;i<=n;i++)
cin>>t,a.push_back(t);
a.push_back(INF);
while(n-->1)
{

for(k=1;k<=n;k++)
if(a[k-1]<a[k+1]) break;
int s=a[k-1]+a[k];
for(j=k-1;j>=0;j--)
if(a[j]>a[k-1]+a[k]) break;

a.erase(a.begin()+k-1);
a.erase(a.begin()+k-1);
a.insert(a.begin()+j+1,s);
ans+=s;
}
cout<<ans;
return 0;
}

证明

本算法基于最优二叉树提出

二叉树中预期比较次数