关于删数问题

关于删数问题
原题来源于洛谷:P1106 删数问题
键盘输入一个高精度的正整数 N(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N和 k,寻找一种方案使得剩下的数字组成的新数最小。
分析:运用一种贪心:从下标0开始遍历整个整数字符串,如果第i个数比第i+1个数大,那么删去第i个数。然后重新从下标0开始遍历字符串,继续以此类推。
注意:可能出现数字一直递增的情况,所以要在代码结尾判断一下,若删除的个数不够则重新从字符串结尾删除数字,直到删除的个数足够。

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long LL;
const int maxv=1001000;
const int mod=100000;
void solve(int num){

}
int main()
{
    int num;
    string str;
    char strChar[300];
    //getline(cin,str); //洛谷的getline有问题,不推荐使用。
    scanf("%s",strChar);
    str=strChar;
    scanf("%d",&num);
    int len=str.size();
    while(num>0){
        int pos=num;
        for(int i=0;i<str.size()-1;i++){
            if(str[i]>str[i+1]){
                str.erase(str.begin()+i);
                num--;
                i--;
                break;
            }

        }
        if(!num){
            while(str[0]=='0'&&str.size()!=1) str.erase(str.begin());
            printf("%s",str.c_str());
            return 0;
        }
        if(pos==num) break; //若num前后无变化,则说明整个字符串是递增字符串。
    }
    for(int i=0;i<num;i++) str.erase(str.end()-1);
    while(str[0]=='0'&&str.size()!=1) str.erase(str.begin());
    printf("%s",str.c_str());
    return 0;
}

代码如上,欢迎讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值