比赛 20160412 评测结果 C
题目名称 饭堂 最终得分 0
用户昵称 mikumikumi 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2016-04-12 11:15:08
显示代码纯文本
#include<cstdio>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
const int SIZEN=10010;
int N,K;
int t[SIZEN];
void read()
{
	scanf("%d%d",&N,&K);
	char ch;
	while(true)
	{
		ch=getchar();
		if('0'<=ch&&ch<='9') break;
	}
	t[1]=ch-'0';
	for(int i=2;i<=N;i++)
	{
		ch=getchar();
		t[i]=ch-'0';
	}
}
int ans=0x7fffffff/2,id=0;
int ans_pos[SIZEN];
int now[SIZEN];
void solve(int x)
{
	priority_queue<pair<int,int> > Q[1010];
	int tem=0;
	for(int i=1;i<=N;i++) 
	{
		if(t[i]-x>0) Q[abs(t[i]-x)].push(make_pair(1,-i));
		else Q[abs(t[i]-x)].push(make_pair(0,i));
	}
	int j=0;
	for(int i=1;i<=K;)
	{
		while(!Q[j].empty()&&i<=K)
		{
		int v=Q[j].top().second;Q[j].pop();
		now[i]=abs(v);
		tem+=j;
		i++;
		}
		j++;
	}
	if(tem==ans)
	{
		int pos[SIZEN],tpos[SIZEN];
		for(int i=1;i<=N;i++) pos[i]=t[i],tpos[i]=t[i];
		for(int i=1;i<=K;i++) pos[ans_pos[i]]=id;
		for(int i=1;i<=K;i++) tpos[now[i]]=x;
		for(int i=1;i<=N;i++) 
		{
			if(pos[i]<tpos[i]) return;
			if(pos[i]>tpos[i]) break;
			if(i==N) return;
		}
		for(int i=1;i<=K;i++) ans_pos[i]=now[i]; 
	}
	if(tem<ans)
	{
		id=x;
		ans=tem;
		for(int i=1;i<=K;i++) ans_pos[i]=now[i];
	}
	//cout<<id<<endl;
	//for(int i=1;i<=K;i++) cout<<ans_pos[i]<<endl;
	//cout<<endl;
}
int main()
{
	freopen("fancy.in","r",stdin);
	freopen("fancy.out","w",stdout);
	read();
	for(int i=0;i<=9;i++) solve(i);
	printf("%d\n",ans);
	for(int i=1;i<=K;i++) t[ans_pos[i]]=id;
	for(int i=1;i<=N;i++) printf("%d",t[i]);
	return 0;
}