蒟蒻思路是出发的时间一定满足 start=ti ,一定是在某个人等待的时间出发才是最优的。
所以枚举是第 i 个人出发的时间作为开始时间, dpi 表示前 i 个人的最短时间, endi 表示最优的时候车回来的时间。然后 dpi 由 dpk(k<i) 转移(具体蒟蒻也想不清楚)。
求一个让蒟蒻错误的数据QWQ!
//25pts
#include <bits/stdc++.h>
#define int long long
#define N 505
using namespace std;
int n,m,a[N],dp[N],ans,s[N],end[N],Time,cost;
signed main(){
ios::sync_with_stdio(false); cin.tie(0);
while(cin>>n>>m){
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
s[0]=0; for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
ans=-1;
for(int i=1;i<=n;i++){
memset(dp,-1,sizeof(dp)); dp[0]=0;
memset(end,0,sizeof(end));
for(int j=1;j<=i;j++){
dp[j]=a[i]*j-s[j];
end[j]=a[i]+m;
}
for(int j=i+1;j<=n;j++){
for(int k=0;k<j;k++){
Time=max(a[j],end[k]); cost=dp[k]+Time*(j-k)-s[j]+s[k];
if(dp[j]==-1) dp[j]=cost,end[j]=Time+m;
else if(cost<dp[j]) dp[j]=cost,end[j]=Time+m;
else if(cost==dp[j]) end[j]=min(end[j],Time+m);
}
}
if(ans==-1) ans=dp[n];
else ans=min(ans,dp[n]);
}
cout<<ans<<endl;
}
return 0;
}