比赛 |
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;
}