主要思想:贪心
每一次都从前往后找
找到第一个数满足 它自己的后一位比前一位大的数
然后删去
因为对于一个位数已知的数来说
位数越靠前 对它值的大小影响越大
(这是可以有严格数学证明的)
//例1、删数问题(delete.cpp NOI94)
//洛谷 P1106 删数问题
//2017.3.6
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string s; //正整数S
int n; //删去n个
int p = 0;
int main(){
cin >> s >> n;
s.insert(s.length(), "0"); //在结尾加上一个0 以便比较
// cout << s << endl;
//去除前导0
while (s[0] == '0') s.erase(0, 1);
// cout << s << endl;
while(n){
n--;
for (int i = 0; i < s.length(); i++){
// cout << s[i] << " " << s[i + 1] << endl;
if (s[i] > s[i + 1]){
s.erase(i, 1);
// cout << s << endl;
break;
}
}
}
// cout << s << endl;
s.erase(s.length() - 1, 1); //去掉0
// cout << s << endl;
//去除前导0
while (s[0] == '0') s.erase(0, 1);
cout << s;
return 0;
}
有点要注意:
1. “高精度的正整数”不用怕 字符串输入输出即可
2. 可以先在结尾加上一个0 以便比较 (最后勿忘删去)
3. 特别注意前导0 (大坑) 不论是一开始读入时 还是输出时
4. str.erase(pos, k) 删去字符串str中从pos位开始的k个数
P.s: 关于字符串的小操作