/* 寻找最大数
题目内容:
请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
比如当n=92081346718538,m=10时,则新的最大数是9888
输入描述
第一行输入一个正整数T,表示有T组测试数据每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)
输出描述
每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数
输入样例
2
92081346718538 10
1008908 5
输出样例
9888
98
*/
//暴力求解,循环搜索m次逆序的将其去掉,通过将其赋为后面大的那个数的相反数,如果有m个逆序,那得到的除去负值就是该
//求最大数,如果去掉的不足m个,显然前面len - m个非负数就是所求最大数。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main(){
char a[105];
int b[105], c[105];
int n;
cin >> n;
while(n--){
int m;
cin >> a;
cin >> m;
int count = 0, len = strlen(a);
for(int i = 0; i < len; i++)
b[i] = a[i] - ‘0‘;
for(int j = 0; j < m; j++)
for(int i = 0; i < len - 1, count <= m; i++){
if(b[i] >= 0 && b[i] < abs(b[i + 1])){
b[i] = - abs(b[i + 1]);
count++;
break;
}
}
int s = 0;
for(int i = 0; i < len; i++){
if(b[i] >= 0){
c[s++] = b[i];
}
}
int len1 = len - m, cc = 0;
for(int i = 0; i < s; i++){
cout << c[i];
cc++;
if(cc >= len1)
break;
}
cout << endl;
}
return 0;
}
核心思想:比如 92081346718538 这个数,去掉十个数之后,按原来的次序组成最大数,那么开始计算,
一共14位数,如果去掉十位数,剩四位数,要想这四位数最大,那么逐次查找,使得首位最大才是结果最大
的前提:一:从前11位开始查找,找到一位最大数,对这个位置做个标记flag;二,从flag到第12位数,找
到最大值,再做标记flag,依次循环,,,,,,直到找到最后结果为止
#include<stdio.h>
#include<string.h>
#define M 101
char a[M],b[M];
int i,j,n,m,flag;
int main()
{
int k;
scanf("%d",&k);
while(k--)
{
j=0;flag=0;
memset(a,0,sizeof(a));
scanf("%s %d",a,&m);
n=strlen(a);
for(int w=m;w<n;w++)
{
char max=a[flag];
for(i=flag;i<=w;i++)
{
if(max<a[i])
{
max=a[i];
flag=i;
}
}
b[j++]=max;
a[flag]=‘0‘;
}
puts(b);
}
return 0;
}