1 条题解
-
1
#include<cstdio> #include<algorithm> using namespace std; const int maxn=502,maxm=102; const int INF=0x7fffffff; #define border2(x) min( border(x),lpos-Mem[x].pos ) #define border(x) min( m-1,Mem[x+1].pos-Mem[x].pos-1 ) int f[maxn][maxm]; int Min[maxn][maxm]; int a[maxn]; struct Node{int pos,num;}Mem[maxn];int sz; int col(int l,int r,int pos) { int res=0; for(int i=l;i<=r;i++) res+=(pos-Mem[i].pos)*Mem[i].num; return res; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); a[0]=-1; for(int i=1;i<=n;i++) { if( a[i]!=a[i-1] ) Mem[++sz].pos=a[i]; Mem[sz].num++; } Mem[sz+1]=(Node){INF,0}; n=sz; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) f[i][j]=Min[i][j]=INF; for(int i=1;i<=n;i++) for(int j=0;j<=border(i);j++) { int pos=Mem[i].pos+j,lpos=pos-m; int val=col(1,i,pos); f[i][j]=val; for(int k=1; k<i and Mem[k].pos<=lpos ;k++) { val-=(pos-Mem[k].pos)*Mem[k].num; f[i][j]=min( f[i][j],Min[k][border2(k)]+val ); } Min[i][j]=f[i][j]; if( j>0 ) Min[i][j]=min( Min[i][j],Min[i][j-1] ); } printf("%d",Min[n][m-1]); return 0; }
- 1
信息
- ID
- 1371
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 50
- 已通过
- 24
- 上传者