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


  • 相关阅读:
    (转)AJAX开发中常用的Firefox Plugins
    几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比
    Excel Oledb设置
    统计数据库中所有表的基本信息
    sql 分页加排序等写法
    sql 创建索引
    SQL Server复制需要有实际的服务器名称才能连接到服务器 错误解决方案
    转转:解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系。"
    Reflector7.5.2.1的Bug
    查询数据库所有依赖
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11045943.html
Copyright © 2011-2022 走看看