Pagini recente » Cod sursa (job #1572617) | Cod sursa (job #2531144) | Cod sursa (job #541766) | Cod sursa (job #683663) | Cod sursa (job #253440)
Cod sursa(job #253440)
#include <stdio.h>
#define Inf 99999999
int N,K,A,B,source,sink;
int v[606],r[606][606],c[606][606];
int abs(int x){
return x>0?x:-x;
}
int q[606*606],prim,ult;
char u[606];
int d[606],t[606];
int drum(){
int i,j;
for (i=0;i<=N+B-A+2;++i){
u[i]=0;
d[i]=Inf;
t[i]=0;}
u[source]=1;
d[source]=0;
t[source]=source;
q[prim=ult=1]=source;
while (prim<=ult){
i=q[prim++];
u[i]=0;
for (j=0;j<=N+B-A+2;++j)
if (r[i][j]>0)
if (d[j]>d[i]+c[i][j]){
d[j]=d[i]+c[i][j];
t[j]=i;
if (!u[j]){
u[j]=1;
q[++ult]=j;}
}
}
for (i=sink;i!=t[i];i=t[i]){
r[t[i]][i]--;
r[i][t[i]]++;}
return d[sink];
}
int main(){
int i,j,k;
freopen("smen.in","r",stdin);
freopen("smen.out","w",stdout);
scanf("%d %d %d %d",&N,&K,&A,&B);
for (i=1;i<=N;++i) scanf("%d",&v[i]);
for (i=1;i<=B-A+1;++i) v[N+i]=A+i-1;
source=0;sink=i+N;
for (i=1;i<=N;++i) r[source][i]=1;
for (i=1;i<=N;++i)
for (j=N+1;j<=N+B-A+1;++j){
r[i][j]=1;
c[i][j]=abs(v[i]-v[j]);
c[j][i]=-c[i][j];}
for (i=N+1;i<=N+B-A+1;++i)
r[i][sink]=1;
j=0;
for (i=1;i<=K;++i)
j+=drum();
printf("%d\n",j);
for (i=1;i<=N;++i){
k=v[i];
for (j=N+1;j<=N+B-A+1;++j)
if (r[i][j]==0) k=v[j];
printf("%d ",k);
}
return 0;
}