救民于水火

x-hechengye 2022-08-11 16:23:44 19 返回题目

#include<bits/stdc++.h>
#define int long long
using namespace std;
const long long maxn=5e2+10;
int a[maxn];
map <int,int> dp[maxn];
int n,m;
int DFS(int l,int t){
	if(l > n) return 0;
	if(l == n) return max(t-a[l],(long long)0);	
	if(t < a[l])return DFS(l,a[l]); //防止RE
	if(dp[l][t - a[l]] != 0)return dp[l][t - a[l]];
	int cnt=0;
	int i=l;
	while(a[i] <= t && i <= n){
		cnt += t - a[i];
		i++;
	}
	int ans = cnt + DFS(i,t+m);
	for(;i<=n;i++){
		cnt += (i - l) * (a[i] - max(a[i-1],t));
		int tmp = cnt;
		if(i+1 <= n) tmp+=DFS(i+1,max(t,a[i])+m);
		ans = min(ans,tmp);	
	}
	return dp[l][t - a[l]] = ans;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	cout<<DFS(1,0)<<endl;
	return 0;
 } 
{{ vote && vote.total.up }}