删数问题--贪心算法+string类的一些应用

1 篇文章 0 订阅

先上题目:

Description

你有一个长度为n的数字串, 现在要求你删除其中k个数字, 使得剩下的数字在不改变原有顺序的情况下,组成的数字最大.

Input

每组数据包含一个数字串(1 <= n <= 1000),和一个整数k (0 <= k < n).

Output

对于每组数据, 输出你的答案.

Sample Input

1452 2
33 0

Sample Output

52
33


思路是这样的,每次从左开始比较,如果全是递减的话,就删除最后一位,如果出现非递减的数,就删除第一次出现递增的那个数。

代码:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str;
    int n;
    string::size_type i;
    while(cin >> str >> n)
    {
        while(n)
        {
            for(i = 0; i != str.size() - 1 && str[i] >= str[i + 1]; i++);
            str.erase(i, 1);
            n--;
        }
        cout << str << endl;
    }

    return 0;
}

size_type其实是string模板类定义的一种类型之一,它与size_of的用法相似,只是它根据存储的类型返回字符串的长度.对于 string具体化,将根据char返回字符串的长度,在这种情况下,size_type与size_of等效.size_of是一种无符号类型.

size_type是在string类内定义的一个无符号整形类型,由于string类里很多方法的返回值都是size_type类型的,所以必须使用size_type进行类型声明。

erase(pos, 1)意思从pos位置删除第一个字符

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值