我写的O(tm)暴力,直接交上去WA了把初始化去掉就对了。。
#include<bits/stdc++.h>
using namespace std;
const int N=4*1e6+5;
int n,m,mxt,ans=INT_MAX,sum[N],cnt[N],f[N];
ifstream fin("sample.in");
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
int main(){
fin>>n>>m;
memset(f,0x3f,sizeof(f));
for(int i=1,tem;i<=n;i++)
fin>>tem,sum[tem]+=tem,cnt[tem]++,mxt=max(mxt,tem);
for(int i=1;i<=mxt+m;i++)sum[i]+=sum[i-1],cnt[i]+=cnt[i-1];
for(int i=1;i<mxt+m;i++){
f[i]=cnt[i]*i-sum[i];
for(int j=max(0,i-2*m+1);j<=i-m;j++)
f[i]=min(f[i],f[j]+(cnt[i]-cnt[j])*i-(sum[i]-sum[j]));
if(i>=mxt)ans=min(ans,f[i]);
}
return cout<<ans<<endl,0;
}