寻找最大数

来源:互联网 发布:家用网络交换机的作用 编辑:程序博客网 时间:2024/06/05 17:20

描述

请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,

比如当n=92081346718538,m=10时,则新的最大数是9888 

 

输入

第一行输入一个正整数T,表示有T组测试数据
每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)

输出

每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数

样例输入

2

92081346718538 10

1008908 5

样例输出

9888

98

思路:题目中明确的指出了要删除一部分数,使得剩下的数最大,那么我们同样可以将思路反转,我们来选取最大的数,使之构成s最大的数。就像样例中m=10;我们就可以选取strlen(s)-m个数字来构成我们所需要的数。首先我们将数字以字符串的形式来存储。其次,我们需要选择最高位的数字,但是题目中的要求是在原数上删除,所以我们不可以打乱原数字各个位的顺序,所以第一个数字我们只能从s[0]到s[m]中查找最大数,然后从最大数字之后的一位到s[m+1]中查找第二位,直至找到最后一位。在这个过程中我们必须要保证还有足够的数字来供我们选择,因为不管什么,数位多的肯定要比数位少的大。

 

#include<iostream>

#include<stdio.h>

#include<string>

#include<string.h>

using namespace std;

int main()

{

char s[150],h[150];//定义数组s用来存放输入的最大数,h用来放每次找到的局部最优解

int a,b,c,d,i,j,max,count;

cin>>a;

while(a--)

{

scanf("%s%d",&s,&b);

c=strlen(s);//测字符数组的长度

d=0;//记录每次找到的局部最大数字的下标

count=0;

for(i=0;i<c-b;i++)//找c-b次最大值

{

max=-1;//让每次寻找的局部最大值为-1

for(j=d;j<=b+i;j++)//选好j的范围

{

if(max<s[j])

{

max=s[j];

d=j;

}

}

h[count++]=s[d];

d+=1;//选好s[d]为第一位,选第二位数的时候是从s[d+1]位开始到b+i位

}

for(i=0;i<c-b;i++)

{

cout<<h[i];

}

cout<<endl;

}

return 0;

 } 

原创粉丝点击