题目概况
题目链接: https://www.luogu.com.cn/problem/P1106
难度: 普及/提高-
题目分析
简化题目: 题目简洁明了
涉及知识点: 贪心算法、字符串以及小学玄学
解题思路:
看样例,175438,如果删除了,我们就在字符串内无视它
当前数 | 后面的数 | 当前是否删除以及删改后字符串 |
---|---|---|
1 | 7 | 否,175438 |
7 | 5 | 是,15438 |
5 | 4 | 是,1438 |
4 | 3 | 是,138 |
3 | 8 | 否,138 |
8 | -----(则为空) | 是,13 |
不难发现,当当前数大于后面的数就删除当前数。 | ||
但是我们还需要处理前导0的情况 。 |
代码拆解与分析
不必
完整代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
using namespace std;
string s;
int a[300];
int k, len;
//贪心策略:扫一遍,当前数比后面一个大就删(小学奥数)
int main() {
cin >> s >> k;
len = s.size();
for (int i = 0; i < len; i++) {
a[i] = s[i] - '0';
}
for (int i = 1; i <= k; i++) { //删除k个数
for (int l = 0; l < len; l++) { //扫一遍
if (a[l] > a[l + 1]) { //如果符合我们的贪心策略
for (int j = l; j < len; j++) { //把数字往前移,也就删除了当前数
a[j] = a[j + 1];
}
len--; //长度也要减
break; //删除了就可以继续下一轮了,要不然...
}
}
}
int start = 0;
while (a[start] == 0 && start < len - 1) {
start++;
} //处理前导0,首先当前位置必须还为0,其次你至少保留一位,要不然输出0的情况你就无输出了
for (int i = start; i < len; i++) { //记得你的开始位置是start了!!!!!
cout << a[i];
}
return 0;
}