删数问题
题目描述
键盘输入一个高精度的正整数 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>
using namespace std;
string str;
int k;
int p[255],cnt;//用来存储目标数和记录已经存储的个数
int main(){
cin>>str>>k;
int len=str.size();
int id=-1;
k=len-k;//要选的数的个数
while(k){
int min=10;
for(int i=id+1;i<len;i++){
if((len-i)>=k&&(min>str[i]-'0')){//从答案的前往后选,选的数可能不是最小的,但一定是排在答案第一个的,以此类推
min=str[i]-'0';
id=i;//记录选中数的下标
}
}
p[cnt++]=id;//将下标存到答案数组里
k--;//要选的数减一
}
int i=0;
while(cnt>1&&str[p[i]]=='0')i++;//去除前导0
for(;i<cnt;i++)cout<<str[p[i]];
}