NOYJ——寻找最大数
1)题目:寻找最大数
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888输入第一行输入一个正整数T,表示有T组测试数据
输入
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
样例输入
    2
    92081346718538 10
    1008908 5
样例输出
9888 98
2)算法分析:
题目中明确的指出了要删除一部分数,使得剩下的数最大,那么我们同样可以将思路反转,我们来选取最大的数,使之构成s最大的数。就像样例中m=10;我们就可以选取strlen(s)-m个数字来构成我们所需要的数。首先我们将数字以字符串的形式来存储。其次,我们需要选择最高位的数字,但是题目中的要求是在原数上删除,所以我们不可以打乱原数字各个位的顺序,所以第一个数字我们只能从s[0]到s[m]中查找最大数,然后从最大数字之后的一位到s[m+1]中查找第二位,直至找到最后一位。在这个过程中我们必须要保证还有足够的数字来供我们选择,因为不管什么,数位多的肯定要比数位少的大。
3)源代码:
#include<iostream> 
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<cmath>  
using namespace std;  
  
int main()  
{  
    int ncase;  
    char s[110], ans[110];  
    int m, len, sign, max, num;  
    scanf("%d", &ncase);  
    while(ncase--)  
    {  
        num = sign = 0;  
        scanf("%s%d", s, &m);  
        len = strlen(s);  
        for(int i = 0; i < len - m; ++i) //找m次最大值  
        {  
            max = -1;  
            for(int j = sign; j <= m + i; ++j) //j的范围不能错~保证位数  
            {  
                if(max < s[j] - '0')  
                {  
                    max = s[j] - '0';  
                    sign = j;  
                }  
            }  
            ans[num++] = s[sign++];  
        }  
        for(int i = 0; i < len - m; ++i)  
            cout<<ans[i] - '0';  
        cout<<endl;  
    }  
    return 0;  
}          
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号