Teamwork Gym

按降序排序

所以第2个之后的人每次都有2中决策;

1.和1跑过去

2.和他前面一个跑过去

俩这种取最小值即可

#include<bits/stdc++.h>

#define int long long

using 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<<dp[n]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/minun/p/11379287.html