【描述】键盘输入一个正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S寻找一种方案使得剩下的数字组成的新数最小。(N不超过240位,N>S)
【输入】两行,第一行:正整数N;第二行:正整数S。
【输出】n去掉的s个数字后组成的新的正整数m。
【样例输入】
123006
2
123006
3
【样例输出】
1006
6
【题解】
枚举数字a[ i ],再判断数字a[ i ]是不是在a[i,i+s]中最小,如果不是就删除,每删除一个就使s减1,直到s等于0,或剩余的数量小于总长度,那么剩下的数字都要比前面的数字大,全部删除。
#include<algorithm>
#include<cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char a[1000];
int vis[1000];
int s;
int main ()
{
int t,i,j,flag,flag1,len,h0;
while(scanf("%s",a)!=EOF)
{
cin>>s;
flag=0;
memset(vis,-1,sizeof(vis));
len=strlen(a);
//输出为0的特殊情况
h0=0;
for(i=0;i<len;i++)
{
if(a[i]=='0')
{
h0++;
}
}
if(s>=len-h0)
{
cout<<"0\n";
continue;
}
//一般情况
for(i=0;i<len;i++)
{
t=0;
for(j=1;j<=s;j++)
{
if(a[i]>a[i+j])
{
vis[i]=0;
s--;
break;
}
}
if(i+s+1>len)
{
len-=s;
break;
}
if(!s)
{
break;
}
}
flag1=0;
for(i=0;i<len;i++)
{
if(!flag1 && a[i]=='0')
{
continue;
}
if(vis[i])
{
flag1=1;
cout<<a[i];
}
}
if(!flag1)
{
cout<<'0';
}
cout<<endl;
}
return 0;
}