# 删数问题
## 题目描述
键盘输入一个高精度的正整数 $N$(不超过 $250$ 位),去掉其中任意 $k$ 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 $N$ 和 $k$,寻找一种方案使得剩下的数字组成的新数最小。
## 输入格式
输入两行正整数。
第一行输入一个高精度的正整数 $n$。
第二行输入一个正整数 $k$,表示需要删除的数字个数。
## 输出格式
输出一个整数,最后剩下的最小数。
## 样例 #1
### 样例输入 #1
```
175438
4
```
### 样例输出 #1
```
13
```
算法分析:每次删除的都是山峰,并且靠前的山峰应该越早删除,这样留下来的数会更小。
所以本题贪心的策略是:每次都从开始找山峰(a[i]>a[i+1]),并删除a[i]:即将i+1及之后的字符往前移一位;如果没有山峰,直接删除最后一位。
解析及代码如下:
#include<bits/stdc++.h>
using namespace std;
string str; //用字符串来输入高精度整数
int k; //需要删掉的数字个数
int main(){
cin>>str;
scanf("%d",&k);
int lens=str.size(); //开始从头查找山峰,找到一个就删除一个
while(k--){
for(int i=0;i<=(lens-2);i++){
if(str[i]>str[i+1]){ //从左往右找到了第一个山峰
for(int j=1;j<=(lens-2);j++){
str[j]=str[j+1]; //删除str[i]:即将i~lens-2位置的字符依次往前移一位
}
break;
}
}
lens--; //注意:每次删除一个字符后,字符串的长度就-1;如果没有找到山峰,则删除最后一个字符!!所以lens--在for的外面
}
//输出结果
//注意:需要去掉前导0
int begin=0;
while(str[begin]=='0'&&begin<lens){
begin++;
}
if(begin==lens) cout<<0; //注意:需要特判一下结果是否为0
else{
for(int i=begin;i<lens;i++){
cout<<str[i];
}
}
return 0;
}