求助wqs,WA 70 /kk
查看原帖
求助wqs,WA 70 /kk
227824
JK_LOVER楼主2020/11/11 15:40
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll read() {
	ll x = 0,f = 0;char ch = getchar();
	while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();}
	while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();}
	return f ? -x : x;
}
const ll N = 3100,inf = 1e13;
ll f[N],g[N],s[N],d[N],dis[N],w[N][N];
ll n,K;
void solve(ll mid) {
	for(int i = 1;i <= n;i++) f[i] = inf,g[i] = 0;
	f[0] = g[0] = 0;
	for(int i = 1;i <= n;i++) {
		for(int j = 0;j < i;j++) {
			if(f[j] + w[j + 1][i] + mid < f[i]) {
				f[i] = f[j] + w[j + 1][i] + mid;
				g[i] = g[j] + 1;
			}
		}
	}
}
int main() {
	n = read();K = read();
	for(ll i = 1;i <= n;i++) d[i] = read();
	sort(d + 1,d + 1 + n);
	for(ll i = 1;i <= n;i++) s[i] = s[i - 1] + d[i];
	for(ll i = 1;i <= n;i++) {
		for(ll j = i + 1;j <= n;j++) {
			ll mid = i + j >> 1;
			w[i][j] += d[mid] * (mid - i) - (s[mid - 1] - s[i - 1]);
			w[i][j] += (s[j] - s[mid]) - d[mid] * (j - mid); 
		}
	}
	ll l = 0,r = inf,ans = inf;
	while(l <= r) {
		ll mid = l + r >> 1;
		solve(mid);
		if(g[n] <= K) ans = mid,r = mid - 1;
		else l = mid + 1;
	}
	solve(ans);
	printf("%lld\n",f[n] - ans * g[n]);
	return 0;
}
2020/11/11 15:40
加载中...