• p1156集合删数


    题目描述

      一个集合有如下元素:1是集合元素;若P是集合的元素,则2 * P +1,4*P+5也是集合的元素,取出此集合中最小的K个元素,按从小到大的顺序组合成一个多位数,现要求从中删除M个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字。
    注:不存在所有数被删除的情况`

    输入格式:

      输入的仅一行,K,M的值,K,M均小于等于30000。


    输出格式 Output Format
      输出为两行,第一行为删除前的数字,第二行为删除后的数字。


    样例输入 Sample Input
    5 4


    样例输出 Sample Output
    137915
    95

    时间限制 Time Limitation
    1s

    经典问题

      思路:先开一个数组num[i](初始num[1]=1别忘了),然后就从2*num[i]+1和4*num[i]+5中选较小的就行了,第二问我就是把数组中的数转换为字符串,因为你要删

    m个数,所以就选k-m个数,要让选的数最大,就让最高位的数最大而且次高位的数也最大,依次类推;

    这道题也又用到了数字转字符串,这是本焫鷄第二次遇到这个东西(我就用了两次QAQ)

    头文件#include<sstream>

    for(int i=1;i<=k;i++)//数字转为字符串
    {
      stringstream ss;
      ss<<num[i];
      string str;
      ss>>str;
      s+=str;
    }

    (我还是太鶸了)

    代码如下:

      

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<ctime>
    #include<sstream>
    using namespace std;
    long long num[310000];
    int main()
    {
        int k,m;
        cin>>k>>m;
        num[1]=1;
        int s1=1,t1=1;
        for(int i=2;i<=k;i++)
        {
            int q=2*num[s1]+1;
            int w=4*num[t1]+5;
            if(q<w)
            {
                s1++;
                num[i]=q;
            }
            else if(q==w)
            {
                s1++;t1++;
                num[i]=q;
            }
            else
            {
                t1++;
                num[i]=w;
            }
        }
        for(int i=1;i<=k;i++)
            cout<<num[i];
        cout<<endl;
        string s="";
        for(int i=1;i<=k;i++)//数字转为字符串
        {
            stringstream ss;
            ss<<num[i];
            string str;
            ss>>str;
            s+=str;
        }
        //cout<<s1<<endl;
        string::iterator it =s.begin();s.insert(it,'9');  //在字符串开头填个9和后面的数进行比较
        //cout<<s<<endl;
        int r=0;
        int n=s.size();
        int sum=0;
        int h=1;
        while(h<=n&&sum!=m)
        {
            if(s[h]<=s[r])
            {
                s[++r]=s[h++];
            }
            else
                r--,sum++;
        }
        while(h<=n)
            s[++r]=s[h++];
        for(int i=1;i<n-m;i++)
            cout<<s[i];
        cout<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    C# int类型的GetProperty的PropertyType返回的是Int32,无法通过typeof(int)或者typeof(Int32)进行比较
    MVC5 Authentication身份认证
    java各个类型判断为空
    table固定列宽,每列超出部分用...代替,鼠标悬停显示全部内容
    web前后台数据交互的四种方式(转)
    List<Map<String,String>>操作(遍历,比较)
    JavaScript实现简单的打印功能
    Expected one result (or null) to be returned by selectOne(), but found: 2
    Eclipse Code Template 设置自动加注释(转)
    highcharts动态获取数据生成图表问题
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7237773.html
Copyright © 2020-2023  润新知