夜路过桥
最小的带最大的过去,最小的再回来f[i]=f[i-1]+a[1]+a[i];
最小的带第二小的过去,最小回去,最大两个过去,第二小的回去f[i]=f[i-2]+a[1]+a[i]+a[2]*2;
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int maxn=1e5+10; typedef long long int ll; ll a[maxn],f[maxn]; bool cmp(int x,int y){ return x<y; } int main(){ int n; cin>>n; for(int i=1;i<=n;i++)scanf("%lld",&a[i]); sort(a+1,a+n+1,cmp); f[1]=a[1];f[2]=a[2];f[3]=a[3]+a[2]+a[1]; for(int i=4;i<=n;i++){ f[i]=min(f[i-2]+a[i]+a[1]+a[2]*2,f[i-1]+a[i]+a[1]); } cout<<f[n]<<endl; return 0; }