1 条题解

  • 0
    @ 2025-12-6 16:07:11

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 4000400;
    
    int n, m, t, maxt;
    long long f[maxn], cnt[maxn];
    
    int main() {
    	cin >> n >> m;
    	for (int i = 0; i < n; i ++) {
    		cin >> t;
    		cnt[t] ++;
    		if (t > maxt) maxt = t;
    	}
    	for (int i = 0; i <= maxt + m; i ++) {
    		long long tmp = 0;
    		for (int j = 0; j < m && i-j >=0; j ++) {
    			tmp += cnt[i-j] * ( (long long) j );
    		}
    		f[i] = tmp;
    		if (i >= m) f[i] += f[i-m];
    		for (int j = m+1; j <= 2*m && i - j >= 0; j ++) {
    			tmp += cnt[i-j+1] * ( (long long) (j-1) );
    			if (f[i-j] + tmp <= f[i]) f[i] = f[i-j] + tmp;
    		}
    	}
    	long long ans=f[maxt];
    	for(int i=1;i<=m;i++) 
    	{
    		ans=min(ans,f[maxt+i]);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

    信息

    ID
    3633
    时间
    2000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者