50,820
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
P1106 删数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题的要我们求剩下的最小数,即让我们尽量把大的数清除,并且是先把前面较大的数清除。何为较大的数?如果属于“山峰”(该数大于两边的数),即为较大的数。题面没明确说前导0需不需要进行处理,所以我就直接交了一个代码上去,WA了,证明不需要输出前导0,所以我们需要人为清除前导0。
#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
string s;
int k;
int main() {
cin>>s>>k;
while(k--) {
//由于是从左到右遍历,所以下面的if只需要判定与右边的数的关系即可
for(int i=0; i<s.size(); i++)
if(s[i]>s[i+1]) {
s.erase(i,1);//从第i个位置开始清除1个单位(字符串长度会随之改变)
break;//清除完就下一个
}
}
//处理前导0问题
while(1) {
if(s.size()==1) break;//如果最后一个数仍为0,就按0来输出
if(s[0]=='0') s.erase(0,1);//如果是前导0就清掉
else break;//没有前导0就可以输出了
}
cout<<s;
return 0;
}