寻找最大数
时间限制:
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
-
第一行输入一个正整数T,表示有T组测试数据
思路:这道题不难,就是技巧性太强了,我来一一识破他们:首先,你要在字符串的后边空出来m位,因为你要查找m次,一次往后一位就可以了,接下来是重点了,他每次寻找的范围其实是一个矩形,也就是说,是m个矩形在一个嵌套呢,只是矩形的大小不一样,矩形的起始位置是前一次寻找到的最大数的后一位开始,这就是这道题的精髓。
下面是C++代码,很容易就能转化成C语言的,自己可以试试。
<div>#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std;</div><div>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; } </div>