这一道题绝对恶意评分了
0-9,那么不如全求一遍
对于每一个数字的话,显然先改差为 1 的,然后2---
并且把大数改小是优先的
而且把大数该小从前往后,小数改大从后往前
这样我们先记录一下每个数字有多少个
就好办了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#define lll long long
using namespace std;
string s;
int a[11];
int n,m;
int anss=99999999;
int Ar;
int ans[11][11];
int cos[11];
string an,em;
void cal(){
for(int i=0;i<=9;++i){
if(cos[i]>anss)
continue;
em=s;
for(int j=0;j<i;++j){
for(int z=n-1;z>=0;--z){
if((s[z]-'0'==j)&&ans[i][j]){
em[z]='0'+i;
ans[i][j]--;
}
}
}
for(int j=i+1;j<=9;++j){
for(int z=0;z<n;++z){
if((s[z]-'0'==j)&&ans[i][j]){
em[z]='0'+i;
ans[i][j]--;
}
}
}
if(cos[i]<anss){
// cout<<"FD";
an=em;
anss=cos[i];
}else{
if(em<an){
an=em;
}
}
}
cout<<anss<<endl;
cout<<an;
}
int main(){
cin>>n>>m;
cin>>s;
for(int i=0;i<n;++i){
a[s[i]-'0']++;
}
for(int i=0;i<=9;++i){
int res=a[i];
if(res>=m){
cout<<0<<endl;
cout<<s<<endl;
return 0;
}
for(int j=1;j<=9;++j){
if(i+j<=9){
if(res+a[i+j]>=m){
cos[i]+=j*(m-res);
ans[i][i+j]+=m-res;
break;
}else{
res+=a[i+j];
cos[i]+=(a[i+j]*j);
ans[i][i+j]=a[i+j];
}
}
if(i-j>=0){
if(res+a[i-j]>=m){
cos[i]+=j*(m-res);
ans[i][i-j]=m-res;
break;
}else{
res+=a[i-j];
cos[i]+=a[i-j]*j;
ans[i][i-j]=a[i-j];
}
}
}
}
cal();
return 0;
}