zoukankan      html  css  js  c++  java
  • 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]='';
    }
    
    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]='';
    }
    
    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
    ",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
    ",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
    ",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
    ",ans);
    	printf("%s
    ",ss);
    	return 0;
    }
    /*
    16 14
    6124258626539246
    
    22
    4124248424439244
    */
    



  • 相关阅读:
    数据库存储过程和触发器
    现在输入 n 个数字, 以逗号, 分开; 然后可选择升或者 降序排序;
    我们在 web 应用开发过程中经常遇到输出某种编码的字 符, 如 iso8859-1 等, 如何输出一个某种编码的字符串?
    Linux常用命令
    Linux系统基础优化及常用命令
    基于DBUtils实现数据库连接池、蓝图及上下文管理
    Flask基础
    01-Flask入门
    Linux基础系统优化
    Linux中 用户管理与文件权限
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777357.html
Copyright © 2011-2022 走看看