• 【OpenJ_Bailian


    最小新整数

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


  • 相关阅读:
    ios webview调试
    iOS与网页JS交互,看我就够了
    iOS开发工具-网络封包分析工具Charles
    使用 Charles 抓取 App 网络请求
    用css解决table文字溢出控制td显示字数
    Docker容器学习与分享03
    Docker容器学习与分享02
    Docker容器学习与分享01
    写在重新更新之前
    Kali学习笔记30:身份认证与命令执行漏洞
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11045943.html
Copyright © 2020-2023  润新知