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

找到最小数。

输入一个高精度的正整数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;
}

发布了62 篇原创文章 · 获赞 0 · 访问量 1740

猜你喜欢

转载自blog.csdn.net/jhckii/article/details/104475423
今日推荐