CF118C Fancy Number

Lisa

这一道题绝对恶意评分了

0-9,那么不如全求一遍

对于每一个数字的话,显然先改差为 1 的,然后2---

并且把大数改小是优先的

而且把大数该小从前往后,小数改大从后往前

这样我们先记录一下每个数字有多少个

就好办了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#define lll long long
using namespace std;
string s;
int a[11];
int n,m; 
int anss=99999999;
int Ar;
int ans[11][11];
int cos[11];
string an,em;
void cal(){
	for(int i=0;i<=9;++i){
		if(cos[i]>anss)
		continue;
		em=s;
		for(int j=0;j<i;++j){
			for(int z=n-1;z>=0;--z){
				if((s[z]-'0'==j)&&ans[i][j]){
					em[z]='0'+i;
					ans[i][j]--;
				}
			}
		}
		for(int j=i+1;j<=9;++j){
			for(int z=0;z<n;++z){
				if((s[z]-'0'==j)&&ans[i][j]){
					em[z]='0'+i;
					ans[i][j]--;
				}
			}
		}
		if(cos[i]<anss){
		//	cout<<"FD";
			an=em;
			anss=cos[i];
		}else{
			if(em<an){
				an=em;
			}
		}
	}
	cout<<anss<<endl;
	cout<<an;
}
int main(){
	cin>>n>>m;
	cin>>s;
	for(int i=0;i<n;++i){
		a[s[i]-'0']++;
	}
	for(int i=0;i<=9;++i){
		int res=a[i];
		if(res>=m){
			cout<<0<<endl;
			cout<<s<<endl;
			return 0;
		}
		for(int j=1;j<=9;++j){
			if(i+j<=9){
				if(res+a[i+j]>=m){
					cos[i]+=j*(m-res);
					ans[i][i+j]+=m-res;
					break;
				}else{
					res+=a[i+j];
					cos[i]+=(a[i+j]*j);
					ans[i][i+j]=a[i+j];
				}
			}
			if(i-j>=0){
				if(res+a[i-j]>=m){
					cos[i]+=j*(m-res);
					ans[i][i-j]=m-res;
					break;
				}else{
					res+=a[i-j];
					cos[i]+=a[i-j]*j;
					ans[i][i-j]=a[i-j];
				}
			}
		}
	}
	cal();
	return 0;
}
	


上一篇:C#中的PLINQ(并行LINQ)


下一篇:使用BAPI_MATERIAL_SAVEDATA无法写入扩展字段