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;
}