Teamwork Gym - 101492E (dp)
按降序排序
所以第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; }