贪心算法-删数问题

首先,删数和添加数是一样的,我们可以将思路转变为添加数字。
每次添加数字都是一段数字的最小值。
我们看以下例子:
213
如果每次都添加最小值,则会输出21,显然不是我们想要的13。
所以我们在找到一个最小值时,要首先在这个最小值的右边开始添加,当右边没有数字的时候,从左边找。
首先找到1,找右边的3,才能形成我们需要的13。

#include "iostream"
#include "stack"
using namespace std;
//找左边
int findMinPos(string t,int lo,const bool bl[]){
    if(lo+1==t.length() || bl[lo+1]) return -1;
    char min = t[lo+1];
    int pos = lo+1;
    for(int i=lo+2;i<t.length();i++){
        if(bl[i]) break;
        if(t[i] < min) {
            min = t[i];
            pos = i;
        }
    }
    return pos;
}
//找右边
int findMinPos_(string t,int lo,const bool bl[]){
    if(lo==0 || bl[lo-1]) return -1;
    char min = t[lo];
    int pos = lo;
    for(int i=lo-1;i>-1;i--){
        if(bl[i]) break;
        if(t[i] < min) {
            min = t[i];
            pos = i;
        }
    }
    return pos;
}
int main(){
    string a;
    int k;
    cin >> a >> k;
    stack<int> num;//用于存放当前找到哪了
    bool pos[a.length()];//各个找到的位置
    for(int i=0;i<a.length();i++) pos[i] = false;//初始化
    if(a.length()==k) return 0;//删完就直接结束吧
    int temp = findMinPos(a,0,pos);//找第一个
    pos[temp]= true;
    num.push(temp);
    int count = 0;
    while(count!=a.length()-k-1){
        temp = num.top();
        int temp1= findMinPos(a,temp,pos);
        if(temp1==-1){//左边找不到找右边
            temp1 = findMinPos_(a,temp,pos);
            if(temp1==-1){
                num.pop();//没找到就直接不找当前位置,去找上一个位置的右边。
                continue;
            }
        }
        //找到就把当前位置记下,从当前位置开始找。
        count++;
        num.push(temp1);
        pos[temp1] = true;
    }
    for(int i=0;i<a.length();i++) if(pos[i]) cout << a[i];
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值