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

最小新整数

Descriptions:

给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456

Input

第一行t, 表示有t组数据; 
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。

Output

t行,每行一个数字,表示从n中删除k位后得到的最小整数。

Sample Input

2
9128456 2
1444 3

Sample Output

12456
1

题目链接:

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

 

一开始简单的认为是删除最大数,结果WA了一次,然后发现这组数据

                       1528     1

                如果直接删最大的8,结果为152,如果删掉5,结果为128,显然删掉5才是最佳答案。

      后来发现

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

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

      3.如果还k>0, 此时所有数都相等,那就依次删吧

 

AC代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define ME0(x) memset(x,0,sizeof(x))
using namespace std;
int n,k;
string s;
int findMax()
{
    int pos=-1;//最大数值的位置
    int maxn=-1;//最大的数值
    for(int i=0; i<s.length(); i++)
    {
        if(s[i]-'0'>maxn)
        {
            maxn=s[i]-'0';
            pos=i;
        }
    }
    return pos;
}
int main()
{
    cin>>n;
    while(n--)
    {
        cin >> s>>k;
        //先删去大于右边的数
        for(int i=0; i<s.length()-1&&k>0; ++i)
        {
            if(s[i]>s[i+1])
            {
                s.erase(i,1);
                --i;
                --k;
            }
        }
        //如果k>0,删去最大的数
        while(k>0)
        {
            s.erase(findMax(),1);
            --k;
        }
        //k仍大于0,此时所有数都相等,依次删除即可
        if(k>0)
        {
            for(int i=0; i<s.length(); ++i)
            {
                s.erase(i,1);
                --i;
                --k;
            }
        }
        cout<<s<<endl;
    }
}

 



posted on 2019-06-18 16:31  Sky丨Star  阅读(584)  评论(0编辑  收藏  举报

导航