【洛谷题解】P1106 删数问题

题目概况

题目链接: 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 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(洛谷题解,【算法】贪心,算法,贪心算法,c++)