寻找最大数
时间限制: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
来源
第六届itat复赛B卷2题改编
上传者
时间限制: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
来源
第六届itat复赛B卷2题改编
上传者
ACM_赵铭浩
思路:贪心思路跟上一篇整数去位思想一样,上一道是在一个n位长的数字中去掉m位使得这个数最小,这里是去掉m位使得这个数最大,
贪心策略还是从i到i+m之间找到一个j使得这个j比i大。然后就把i到j之间的数删去。即m-(j-i);
当数据范围比较大时可以预处理下就好了
代码如下
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
#include<string>
const int inf =-10000000;
int b[1000005];
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
string a;
int k;
cin>>a>>k;
int l=a.length();
//memset(b,0,sizeof(b));
b[l]=inf;
for(int i=l-1; i>=0; i--)
{
if(a[i]<a[i+1])
b[i]=i+1;
else
{
int t=i+1;
while(a[i]>=a[t]&&t<l )
{
t=b[t];
}
b[i]=t;
}
}
for(int i=0; i<l; i++)
{
//printf("%d ",b[i]);
}
//printf("\n");
int i=0;
int flag=0;
while(k>0)
{
if((b[i]-i)<=k)
{
k-=(b[i]-i);
i=b[i];
flag=1;
}
if(!flag)
printf("%c",a[i++]);
else flag=0;
}
while(i<l)
{
printf("%c",a[i++]);
}
printf("\n");
}
}