Problem Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Sample Input
178543 4
Sample Output
13
思路:
遇到逆序就删除,如果逆序删除完之后还是没有删够,那就删除最后一个数字 n - num 次即可
12548 删除3位数字 -> 1248 -> 124 ->12
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,num;
string s;
while(cin >> s){
scanf("%d",&n);
if(n >= s.size()){
printf("0\n");
continue;
}
else{
num = 0;
for(int i = 1;i < s.size();i++){
if(s[i - 1] > s[i]){
num++;
s.erase(i - 1,1);
if(num == n)
break;
//由于删除完之后下标不会往前移动,且循环要加1,所以要想回到原来的位置共需要减2
i = i - 2;
}
}
if(num != n)
for(int i = 0;i < n - num;i++)//删除最后一个,删除n - num次即可
s.erase(s.size() - 1);
for(int i = 0;i < s.size();i++){
if(s[i] != '0'){
for(int j = i;j < s.size();j++)
cout << s[j];
printf("\n");
break;
}
if(i == s.size() - 1){//如果最后全部都是0,那么只要输出0即可
printf("0\n");
break;
}
}
}
}
return 0;
}