题意:一个有
一道贪心题。
首先发现
我们建立一个结构体,存储每个数位改变的花费,位置,初始值和最终值。枚举
时间复杂度
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 1e9
using namespace std;
const int maxn=100101;
int n,k,money=INF;
char s[maxn],ans[maxn];
struct node
{
int cnt;//花费
int id;//位置
int f;//初始值
int e;//最终值
}q[maxn];
int cmp(node a,node b)
{
if(a.cnt!=b.cnt)
return a.cnt<b.cnt;
else
{
if(a.id<b.id)
return a.e<a.f;
else
return b.e>b.f;
}
}
int main()
{
freopen("canteen.in","r",stdin);
freopen("canteen.out","w",stdout);
scanf("%d%d\n",&n,&k);
for(int i=1;i<=n;i++)
scanf("%c",&s[i]);
for(int i=9;i>=0;i--)//枚举相同的数位
{
int r=i;
for(int j=1;j<=n;j++)
{
q[j].cnt=abs(i-(s[j]-'0'));
q[j].id=j;
q[j].f=s[j]-'0';
q[j].e=i;
}
sort(q+1,q+n+1,cmp);
int p=0;
for(int i=1;i<=k;i++)
p+=q[i].cnt;
if(p<=money)
{
money=p;
for(int j=1;j<=n;j++)
ans[j]=s[j];
for(int j=1;j<=k;j++)
ans[q[j].id]=r+'0';
}
}
printf("%d\n",money);
for(int i=1;i<=n;i++)
printf("%c",ans[i]);
return 0;
}