救民于水火
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 }}