最近闲着没事干来逛逛洛谷,找到一个贪心问题:
# P1106 删数问题
## 题目描述
键盘输入一个高精度的正整数 $n$(不超过 $250$ 位),去掉其中任意 $k$ 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 $n$ 和 $k$,寻找一种方案使得剩下的数字组成的新数最小。
## 输入格式
输入两行正整数。
第一行输入一个高精度的正整数 $n$。
第二行输入一个正整数 $k$,表示需要删除的数字个数。
## 输出格式
输出一个整数,最后剩下的最小数。
## 输入输出样例 #1
### 输入 #1
```
175438
4
```
### 输出 #1
```
13
```
## 说明/提示
用 $\operatorname{len}(n)$ 表示 $n$ 的**位数**,保证 $1 \leq k < \operatorname{len}(n) \leq 250$。
**注意:去掉若干数字后剩下的数可以存在前导零,而输出时不要输出前导零。**
我没多想,直接肝代码(我不爱装*,所以写出来的萌新也能看懂):
#include<iostream>
#include<string>
using namespace std;
int main() {
int s;
string n;
cin>>n>>s;
int l=n.length();
for(int i=0;i<s;i++) {
int f=0;
for(int j=0;j<l-1;j++) {
if (n[j]>n[j+1]) {
n.erase(j,1);
f=1;
break;
}
}
if(f==0) {
n.erase(n.end()-1);
}
}
cout<<n;
return 0;
}
刚得意地提交就炸缸了(doge)
第7个测试点WA的离谱
一看题哎发现了个注意说有前导零(内心OS:这出题的真阴)
所以在输出前面加了:
while (n[0]=='0' && n.length()>1) {
n.erase(0,1);
}
成功AC这道题
制作不易,给个三连叭
这就是这道题的题解,谢谢浏览!