Cod sursa(job #2778587)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 1 octombrie 2021 19:56:12
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define nmax 201
using namespace std;
string prob="smen";
ifstream in(prob+".in");
ofstream out(prob+".out");
int v[nmax];
int n,k,a,b;
unordered_map<int,int> per,res;
bool findpair(int nr,int i,int dist){
    for(int ii=i;ii<n;ii++){
        if(nr+dist==v[ii]&&res[ii]==nmax){res[ii]=nr;per[nr]=v[ii];return 1;}
        if(nr-dist==v[ii]&&res[ii]==nmax){res[ii]=nr;per[nr]=v[ii];return 1;}
    }
    for(int ii=i;ii<n;ii++){
        if(nr+dist==v[ii]&&findpair(res[ii],ii+1,dist)){res[ii]=nr;per[nr]=v[ii];return 1;}
        if(nr-dist==v[ii]&&findpair(res[ii],ii+1,dist)){res[ii]=nr;per[nr]=v[ii];return 1;}
    }
    return 0;
}
int main(){
    for(int i=0;i<nmax;i++){res[i]=nmax;}
    int minn=0;
    in>>n>>k>>a>>b;
    for(int i=a;i<=b;i++)per[i]=nmax;
    int nr;
    for(int i=0;i<n;i++){
        in>>nr;
        if(nr<a){
            minn+=a-nr;
            nr=a;
        }
        if(nr>b){
            minn+=nr-b;
            nr=b;
        }
        v[i]=nr;
    }
    for(int i=0;i<=400&&k;i++){
        for(int j=a;j<=b;j++){
            if(per[j]==nmax&&findpair(j,0,i)){
                k--;
            }
            if(!k)break;
        }
    }
    for(int i=0;i<n;i++){
        if(res[i]!=nmax){
            minn+=(v[i]-res[i]>0?v[i]-res[i]:res[i]-v[i]);
        }
    }
    out<<minn<<'\n';
    for(int i=0;i<n;i++){
        if(res[i]!=nmax){
            out<<res[i]<<' ';
        }else out<<v[i]<<' ';
    }
}