P1106 删数问题 {详细题解}

戳一戳

题解:
对于这题我们使用贪心思想
贪心策略是比较前一个数是不是比后面一位数要大(因为要得到最小的数,就要尽量让数的前面位数小)
如果要大的话,就把当前的数给删去
得到一个新的string
然后再重新进行一次两两大小的判断
每重新判断一次
就会删去一个数
也就是总体要判断k次
当然也会出现没有前面的数比后面的数要大的情况
此时这个string里面的数是呈现递增的现象的,那么就删除最后一个元素

另外:
要考虑三种特殊情况:
一种是:前导0要删去 列如:012
一种是:数中间的零不能删去 列如:102
一种是:全是0的一种情况 列如:000000

代码:

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

int main() {
	string N;
	int k;
	cin >> N >> k;
	for (int j = 0; j < k; j++) {
		int len = N.length();
		int pos = 0;
		int t = 0;
		for (int i = 0; i < len - 1; i++) {
			if (N[i] > N[i + 1]) {
				pos = i;
				t++;
				break;
			}
			
		}
		if (t == 0) {
			pos = len - 1;
		}
		N.erase(pos, 1);
	}
	int len = N.length();
	int bushiling=0;
	for (int i = 0; i < len-1; i++) {
		if (N[i] != '0') {
			bushiling++;
			cout << N[i];
		}
		else {
			if (bushiling != 0) {
				cout << N[i];
			}
		}
	}
	cout << N[len - 1];
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

veit sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值