寻找最大数
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
-
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888
- 输入
- 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
- 输出
- 每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
- 样例输入
-
2 92081346718538 10 1008908 5
- 样例输出
-
9888 98
- 来源
- 第六届itat复赛B卷2题改编
- 上传者
- ACM_赵铭浩
//刚开始做法:找出len-m个最小的数,然后输出剩下的,wa了几次,后来才想到错在哪了,例如32190 1 ,这种思路得到3219,正确结果应为3290
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int n; 6 scanf("%d",&n); 7 while(n--) 8 { 9 char c,str[100]; 10 int i,j,t,n,m; 11 memset(str,0,sizeof(str)); 12 scanf("%s",str); 13 scanf("%d",&m); 14 for(i=0;i<m;i++) 15 { 16 c='9'+1;t=0; 17 for(j=0;j<strlen(str);j++) 18 { 19 if(str[j]<c) 20 { 21 c=str[j]; 22 t=j; 23 } 24 } 25 str[t]='A'; 26 } 27 for(i=0;i<strlen(str);i++) 28 if(str[i]!='A') 29 printf("%c",str[i]); 30 printf(" "); 31 } 32 return 0; 33 }
//看了下别人的做法:(http://yangchuanhuahpu.blog.163.com/blog/static/186318840201244114422258/)
/*这道题可以理解为:在字符串中找出一个由strlen(str)-m个字符按顺序(不要求连续)拼成的最大数。
其实这是个不断贪心的过程,首先要在str[0]到str[m](包括str[m])找到第一个最大的数字(注意哦,是第一个最大数字)作为最高位数(之所以要在0到m间找,是因为至少要留出strlen(str)-m-1位放在最高位后面的低位),假设是str[k],然后再从str[k+1]到str[m+1](因为此时已经选了1个,所以留出至少strlen(str)-m-2位放在第二位位后面的低位)找到第一个最大的作为第二位数……一直到strlen(str)-m个数被确定完,这样从最高位到最低位都是所能选择的最大值,所以得到的结果也将是最大值。*/
1 #include <stdio.h> 2 #include <string.h> 3 char str1[110],str2[110]; 4 int main() 5 { 6 int T; 7 scanf("%d",&T); 8 while(T--) 9 { 10 int i,j,k,t=0,m,n,len,max; 11 scanf("%s%d",str1,&m); 12 len=strlen(str1); 13 n=len-m; 14 for(i=0,k=0;i<n;i++) 15 { 16 max=-1; 17 for(j=t;j<=m;j++) 18 { 19 if(str1[j]>max) 20 { 21 max=str1[j]; 22 t=j; 23 } 24 } 25 str2[k++]=str1[t]; 26 t++;m++; 27 } 28 for(i=0;i<k;i++) 29 printf("%c",str2[i]); 30 printf(" "); 31 } 32 return 0; 33 }