题目概况
题目链接: 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;
}

这篇博客详细解析了洛谷P1106删数问题,难度为普及/提高级别。博主指出题目简洁明了,主要涉及贪心算法和字符串处理。通过分析样例175438,提出解题策略是忽略删除的数字。文章未提供代码拆解和分析,直接给出了完整代码。
767

被折叠的 条评论
为什么被折叠?



