#include<algorithm>
#include<cstdio>
void read(int &number){
number=0;
char got=getchar();
int minus=1;
while('9'<got||got<'0'){
if(got=='-'){
minus=-1;
};
got=getchar();
};
while('0'<=got&&got<='9'){
number=number*10+got-'0';
got=getchar();
};
number*=minus;
};
void write(int number){
if(number<0){
putchar('-');
number=-number;
};
if(number>9){
write(number/10);
};
putchar(number%10+'0');
};
int main(int argc,char **argv){
using std::max;
using std::min;
int *cnt=new int[4001001]{0};
int *sum=new int[4001001]{0};
int *pln=new int[4001001]{0};
int maxn,maxm,top,time,ans=1e9;
read(maxn);
read(maxm);
for(int iter=1;iter<=maxn;iter++){
read(time);
top=max(top,time);
cnt[time]++;
sum[time]+=time;
};
for(int iter=1;iter<top+maxm;iter++){
cnt[iter]+=cnt[iter-1];
sum[iter]+=sum[iter-1];
};
for(int iter=0;iter<top+maxm;iter++){
pln[iter]=cnt[iter]*iter-sum[iter];
for(int j=0;j<=iter-maxm;j++){
pln[iter]=min(pln[iter],pln[j]+(cnt[iter]-cnt[j])*iter-(sum[iter]-sum[j]));
};
};
for(int iter=top;iter<top+maxm;iter++){
ans=min(ans,pln[iter]);
};
write(ans);
return 0;
};
开了O2 50分TEL,没开O2 25分TLE+RE。