贪心题目——删除数字求最小值

找到最小数。

输入一个高精度的正整数N(不超过5000位) , 去掉其中任意k个数字后剩下的数字按原左右次序 将组成一个新的正整数。
对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小。

输入格式:

第一行给定一个不超过五千位的正整数n。 第二行给定一个不超过n的位数的非负整数k。

输出格式:

最后剩下的最小数。

输入样例:

175438 4

输出样例:

13

思路:
在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小

eg 175438
删除1个:去掉7——15438(不是去掉8——17543)
删除2个:去掉7,5——1438
删除3个:去掉754——138 (不是去掉785——143)

按高位到到低位的顺序搜索,若各位数字递增,则删除最后一个数字
如果递减,则删除第一个(尽量高位)递减区间的首字符
然后回到串首,按上述规则删除下一个数字。

代码:

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<iomanip>
#include<vector>
#include<string>
#define M 5010
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
vector<int>v;
string s;
int main(){
    cin >> s;
    for(int i=0; s[i]; i++)
        v.push_back(s[i]-'0');
    v.push_back(-1);
    
    int k;
    cin >> k;
    while(k--){         //删除k个
        int t=0;
        while(v[t]<=v[t+1] && v[t]!=-1)
            t++;
        v.erase(v.begin()+t);
    }
    
    bool flag = 0;      //输出
    for(int i=0; v[i]!=-1; i++){
        if(v[i]!=0) flag = 1;
        if(flag) cout << v[i];
    }
    if(!flag) cout << 0;
    cout << endl;
    
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值