CodeForces 118C 【模拟】
思路:
枚举0-9之间的数,然后判断。
然后一鼓作气打成了大模拟。。。。我日啊。。。
心疼自己。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int N=1e4+10;
int n,k;
char s[N],ss[N];
int num[19];
int cnt[19],len;
int all[N][15]; void solve(int x)
{
int sum;
for(int i=0;i<len;i++)
{
int e=s[i]-'0';
if(cnt[e])
{
if(e>x)//5->3
{
cnt[e]--;
ss[i]=x+'0';
}
else//3->5
{
if((i-1>=0&&(all[len-1][e]-all[i-1][e])<=cnt[e])||(i==0&&all[len-1][e]<=cnt[e]))
{
ss[i]=x+'0';
cnt[e]--;
}
else
ss[i]=s[i];
}
}
else
ss[i]=s[i];
}
ss[len]='\0';
} char sss[N];
void solve2(int x)
{
int sum;
for(int i=0;i<len;i++)
{
int e=s[i]-'0';
if(cnt[e])
{
if(e>x)//5->3
{
cnt[e]--;
sss[i]=x+'0';
}
else//3->5
{
if((i-1>=0&&(all[len-1][e]-all[i-1][e])<=cnt[e])||(i==0&&all[len-1][e]<=cnt[e]))
{
sss[i]=x+'0';
cnt[e]--;
}
else
sss[i]=s[i];
}
}
else
sss[i]=s[i];
}
sss[len]='\0';
} int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s);
len=strlen(s);
memset(all,0,sizeof(all));
memset(num,0,sizeof(num));
for(int i=0;i<len;i++)
{
int x=s[i]-'0';
if(i==0)
all[i][x]=1;
else
{
for(int kk=0;kk<=9;kk++){
if(kk==x)
all[i][x]=all[i-1][x]+1;
else
all[i][kk]=all[i-1][kk];
}
}
num[x]++;
} int ans=0x3f3f3f3f;
for(int i=0;i<=9;i++)
{
// printf("%d\n",num[i]);
int res=0;
int sum=num[i];
int t=1;
memset(cnt,0,sizeof(cnt));
if(sum>=k)
{
ans=0;
strcpy(ss,s);
break;
}
while(sum<k&&(i+t<=9||i-t>=0))
{
if(i+t<=9)
{
if(num[i+t]+sum>=k)
{
cnt[i+t]=k-sum;
res+=(k-sum)*t;
if(ans>res)
{
solve(i);
ans=res;
//printf("%d %d\n",i,ans);
}
else if(ans==res)
{
solve2(i);
if(strcmp(ss,sss)>0)
strcpy(ss,sss);
}
sum=k;
}
else
{
res+=num[i+t]*t;
sum+=num[i+t];
cnt[i+t]=num[i+t];
}
}
if(i-t>=0)
{
if(num[i-t]+sum>=k)
{
cnt[i-t]=k-sum;
res+=(k-sum)*t;
if(ans>res)
{
solve(i);
ans=res;
//printf("%d %d\n",i,ans);
}
// else if(ans==res)
// {
// solve2(i);
// if(strcmp(ss,sss)>0)
// strcpy(ss,sss);
// }
sum=k;
}
else
{
res+=num[i-t]*t;
sum+=num[i-t];
cnt[i-t]=num[i-t];
}
}
t++;
}
}
printf("%d\n",ans);
printf("%s\n",ss);
return 0;
}
/*
16 14
6124258626539246 22
4124248424439244
*/
CodeForces 118C 【模拟】的更多相关文章
- CodeForces - 427B (模拟题)
Prison Transfer Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- CodeForces - 404B(模拟题)
Marathon Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Sta ...
- Codeforces 709B 模拟
B. Checkpoints time limit per test:1 second memory limit per test:256 megabytes input:standard input ...
- CodeForces - 404A(模拟题)
Valera and X Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit ...
- Codeforces 390A( 模拟题)
Inna and Alarm Clock Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64 ...
- Codeforces 452D [模拟][贪心]
题意: 给你k件衣服处理,告诉你洗衣机烘干机折叠机的数量,和它们处理一件衣服的时间,要求一件衣服在洗完之后必须立刻烘干,烘干之后必须立刻折叠,问所需的最小时间. 思路: 1.按照时间模拟 2.若洗完的 ...
- CodeForces - 796B 模拟
思路:模拟移动即可,如果球落入洞中停止移动.注意:有可能第一个位置就是洞!! AC代码 #include <cstdio> #include <cmath> #include ...
- CodeForces - 864C-Bus-(模拟加油站问题)
https://vjudge.net/problem/CodeForces-864C 题意:两地之间有个加油站,往返走k个单程,最少加油多少次. 大佬几十行代码就解决,我却要用一百多行的if语句模拟解 ...
- Codeforces 709C 模拟
C. Letters Cyclic Shift time limit per test:1 second memory limit per test:256 megabytes input:stand ...
随机推荐
- 一张图理解is_nll isset empty
isset 判断变量是否已存在,如果变量存在则返回 TRUE,否则返回 FALSE. empty 判断变量是否为空,如果变量是非空 或非零 的值,则 empty() 返回 FALSE.换句话说,&qu ...
- Spring MVC工作原理(好用版)
Spring MVC工作原理 参考: SpringMVC工作原理 - 平凡希 - 博客园https://www.cnblogs.com/xiaoxi/p/6164383.html SpringMVC的 ...
- 普林斯顿算法(1.3)并查集(union-find算法)——本质就是一个数 下面的子树代表了连在一起的点
转自:https://libhappy.com/2016/03/algs-1.3/ 假设在互联网中有两台计算机需要互相通信,那么该怎么确定它们之间是否已经连接起来还是需要架设新的线路连接这两台计算机. ...
- Git_学习_06_ 放弃本地修改
一.未使用 git add 缓存代码时 git checkout -- filepathname // 放弃某个文件 git checkout . // 放弃所有文件 git checkout . 用 ...
- rabbitmq-交换机
四种交换机: direct fanout topic headers http://www.jianshu.com/p/469f4608ce5d
- NodeJS中 Path 模块
var path = require('path'); // 当发现有多个连续的斜杠时,会替换成一个: 当路径末尾包含斜杠时,会保留: // 在 Windows 系统会使用反斜杠. var p = p ...
- SLF4j+LOG4j
工作笔记:在myeclipse 中创建一个java project 创建一个 TestSlf4J 类 import org.slf4j.Logger; import org.slf4j.LoggerF ...
- bzoj 2716 天使玩偶 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 果然和 bzoj 2648 是一样的吧: 只是数组要迷之开大,3e5+5 会RE? 代 ...
- 【转】LCS
动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加. 为了节 ...
- Erlang generic standard behaviours -- gen_server terminate
gen_server 主体 module 已经分析完了(http://www.cnblogs.com/--00/p/4271982.html),接着,分析下gen_server 中的terminate ...