最小新整数 OpenJ_Bailian - 4137 (贪心)

https://vjudge.net/problem/OpenJ_Bailian-4137

一道基础的贪心问题, 开始为算法还纠结了好一会, 其实想明白就好了

1.每次都删去位数更大且大于大于右边的数

2.如果依然k>0, 删去最大的数

3.如果依然k>0, 依次删(也就是所有数都相等的情况)

//Bookshelf
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;

int T, k;
string n;
int findMax()
{
    string tmp = n;
    int ret, maxp = -1;
    for(int i = 0; i < n.length(); i++)
        if(n[i]-'0' > maxp) maxp = n[i]-'0', ret = i;
    return ret;
}
void solve()
{
    //先从左往右判断把所有大于右边位的数删掉
    for(int i = 0; i < n.length()-1 && k > 0; i++){
        if(n[i] > n[i+1])
            n.erase(i,1), i--, k--;
    }
    //再每次都删最大的数
    while(k>0){
        n.erase(findMax(), 1), k--;
    }
    //如果依然k>0, 从前往后删掉位数直至k=0 (也就是所有数都一样的情况)
    if(k>0)
        for(int i = 0; i < n.length() && k > 0; i++)
            n.erase(i,1), i--, k--;
    cout << n << endl;
}

int main()
{
    cin >> T;
    while(T--){
        cin >> n >> k;
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/83097440