删数问题
题目描述
键盘输入一个高精度的正整数 N N N(不超过 250 250 250 位),去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N N N 和 k k k,寻找一种方案使得剩下的数字组成的新数最小。
输入格式
输入两行正整数。
第一行输入一个高精度的正整数 n n n。
第二行输入一个正整数 k k k,表示需要删除的数字个数。
输出格式
输出一个整数,最后剩下的最小数。
样例 #1
样例输入 #1
175438
4
样例输出 #1
13
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<cstdio>
#include<iomanip>
using namespace std;
typedef long long ll;
int main()
{
string s;
cin>>s;
int n;
cin>>n;
int len=s.length();
while(n--)
{
for(int i=0;i<len;i++)
{//这里的边界是小于len,原因是最后一个数也可能被删除
if(s[i]>s[i+1])//例子1238删除的是8得到最小值123
{
for(int j=i;j<len;j++)
{
s[j]=s[j+1];//数组后面的往前移
}
len--; //长度减一
break;//删除完毕,退出for循环,又从头开始遍历
}
}
}
int i=0;
while(i<len&&s[i]=='0')//去除前导零的操作
i++;//定位到第一个不是零的数
if(i==len)//如果到len了还是0,那么输出零
cout<<0;
else
{
for(int j=i;j<len;j++)//否则从i输出
cout<<s[j];
}
return 0;
}