NOYJ——寻找最大数

Posted 如许之秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

 

 

以上是关于NOYJ——寻找最大数的主要内容,如果未能解决你的问题,请参考以下文章

NYOJ-448 寻找最大数(贪心)

c语言求最大公约数

nyoj 寻找最大数

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

算法实践| 一步步带你实现寻找最大公约数

hihocoder 1496:寻找最大值(高维前缀最大次大值)