标签:字符数字处理
给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么
(n位且不能含前导零)?
有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开;
最终能得到的最小的数。
2 321654987 1 321654987 2
231654987 132654987
思路:把每一段到当前数的距离求出来。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MAXN=10000; int main() { char a[MAXN]; int t,n,i,f[MAXN]; char s1,min; int k,r,j; while(scanf("%d",&t)!=EOF) { while(t--) { memset(f,0,sizeof(f)); scanf("%s%d",a,&n); int len=strlen(a); j=0; while(n) { min='a'; if(j==len-1) break; for(i=j;i<len;i++) f[i]=i-j;//每个数到j的距离 for(i=j;i<len;i++) { if(a[i]<min&&f[i]<=n) { if(j==0&&a[i]=='0') continue; else{min=a[i];r=i;} } } if(r!=j) { for(k=r;k>j;k--) a[k]=a[k-1]; a[j]=min; n=n-f[r]; } j++; } printf("%s\n",a); } } return 0; }
标签:字符数字处理
原文地址:http://blog.csdn.net/u012346225/article/details/45913483