题目描述
键盘输入一个高精度的正整数 N(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N 和 k,寻找一种方案使得剩下的数字组成的新数最小。
输入格式
输入两行正整数。
第一行输入一个高精度的正整数 n。
第二行输入一个正整数 k,表示需要删除的数字个数。
输出格式
输出一个整数,最后剩下的最小数。
输入输出样例
输入 #1
175438 4
输出 #1
13
思路
我们的思路是这样的:要删m个数,一开始m=k,在左边m+1个数中,找到其中最小的数(如果有多个则选最左边的),记它的位置为t,显然,t左边的l个数都可以删掉,此时还需要删m-l个数,m重新赋值为m-l,而t右边的数是一个新的数列,进行同样的操作,直到选出了n-k个数为止。
这样做可以每找出一个数就直接输出,但还要考虑前导0的问题。以及,若循环结束什么都没输出(意味着答案是0)就在程序结束前输出0。
AC Code
#include <iostream>
#include <string>
using namespace std;
int n,k,a[257],rest,t=1,minp,cnt=0;
bool flag=0;
string num;
int main(){cin>>num>>k;n=num.length();for(int i=1;i<=n;++i)a[i]=num[i-1]-'0';rest=n-k;while(cnt<rest){minp=t;for(int i=t;i<=k+t;++i)if(a[minp]>a[i])minp=i;if(a[minp])flag=1;if(flag)cout<<a[minp];k-=minp-t;t=minp+1;cnt++;}if(!flag) cout<<0;return 0;
}