zoukankan      html  css  js  c++  java
  • 【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;
        }
    }


  • 相关阅读:
    Leetcode Spiral Matrix
    Leetcode Sqrt(x)
    Leetcode Pow(x,n)
    Leetcode Rotate Image
    Leetcode Multiply Strings
    Leetcode Length of Last Word
    Topcoder SRM 626 DIV2 SumOfPower
    Topcoder SRM 626 DIV2 FixedDiceGameDiv2
    Leetcode Largest Rectangle in Histogram
    Leetcode Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11045943.html
Copyright © 2011-2022 走看看