1. 程式人生 > >最小新整數 OpenJ_Bailian - 4137 (貪心)

最小新整數 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;
}