寻找最大数
时间限制:
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
解题思路:贪心型题目,len个数剔除m个,所剩下的数按原序最大。注意题目的要求。所以可以转换为从len个数中取出k=len-m个,组成的数最大。取法为:第一次可以从第一位开始取,可以选择的范围应该是1至len-k+1 ,取到len-k+1的理由是第len-k+1位(包括该位)的右边只有k个数,所以这是个右边界。这个细心点分析下就行。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 110; int t, m, len, k; char c[maxn]; int main() { scanf("%d", &t); while (t--){ scanf("%s%d", c, &m); len = strlen(c); k = len - m; //将问题转化为取出k=len-m为数,使其最大 int begin = 0, end = len - k, index = 0, num, max1 = -1; for (int i = 0; i < k; i++){ for (int j = begin; j <= end; j++){ //遍历数组,注意开始和结束位置的改变 num = c[j] - '0'; if (num > max1){ //不要写>=,因为最大数字有多个,我们去最左边的那个 max1 = num; index = j; } } printf("%d", max1); max1 = -1; begin = index + 1; //注意是index+1; end++; } printf("\n"); } return 0; }
JAVA解决大数问题
-
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); while (a-- > 0){ String s = sc.next(); char[] chs = s.toCharArray(); int n = sc.nextInt(); int num = s.length()-n; Arrays.sort(chs); for(int i = s.length() - 1; i > 0; i--){ if(s.length() - s.indexOf(chs[i]) > num - 1){ System.out.print(chs[i]); s = s.substring(s.indexOf(chs[i]) + 1, s.length()); chs = s.toCharArray(); Arrays.sort(chs); i = s.length(); num -= 1; if (num == s.length()) { System.out.print(s); break; } } if (num == 0) { break; } } System.out.println(); } } }
-
第一行输入一个正整数T,表示有T组测试数据