按降序排序
所以第2个之后的人每次都有2中决策;
1.和1跑过去
2.和他前面一个跑过去
俩这种取最小值即可
#include#define int long longusing namespace std;const int maxn=5e5+10;int a[maxn],dp[maxn];signed main(){ int n,ans=0; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); dp[1]=a[1]; dp[2]=max(a[1],a[2]); for(int i=3;i<=n;i++) dp[i]=min(dp[i-1]+a[1]+a[i],dp[i-2]+a[i]+a[1]+2*a[2]); cout< <