【描述】
总时间限制: 1000m内存限制: 65536kB
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
【输入】
第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
【输出】
t行,每行一个数字,表示从n中删除k位后得到的最小整数。
【样例输入】
2
9128456 2
1444 3
【样例输出】
12456
1
【思想】
做这道题之前,我们必须明确如何取才能使数最小。
我们由上图可得,删掉的数其实都是非上升子序列的开头。
if(c[i]>c[i+1])
但还要分个类,即没有非上升时,删最后的数(即最大);
【代码】
#include<cstdio>
#include<cstring>
char c[250];
void mn()
{
int s,o=0,t;
scanf("%s\n%d",c,&s);
t=s;
int m=strlen(c);
while(s>0)
{
for(int i=0;i<m;i++)
if(c[i]>c[i+1])
{
s--;
m--;
for(int j=i;j<m;j++)
c[j]=c[j+1];
i=m+1;
}
t--;
if(s!=t)
{
m-=s;
s=0;
}
}
while(o<m-1&&c[o]=='0')
o++;
for(int i=o;i<m;i++)
{
printf("%c",c[i]);
c[i]='0';
}
printf("\n");
}
int main()
{
int r;
scanf("%d",&r);
for(int k=1;k<=r;k++)
mn();
}