求助,请HACK我
查看原帖
求助,请HACK我
282080
NewJeanss楼主2020/10/10 22:30

蒟蒻思路是出发的时间一定满足 start=tistart=t_{i} ,一定是在某个人等待的时间出发才是最优的。

所以枚举是第 ii 个人出发的时间作为开始时间, dpidp_{i} 表示前 ii 个人的最短时间, endiend_{i} 表示最优的时候车回来的时间。然后 dpidp_{i}dpk(k<i)dp_{k}(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;
}
2020/10/10 22:30
加载中...