zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [动态规划]保存子问题的结果
    [字符串]第一个不重复的字符
    [抽象建模问题]扑克牌的顺子判断
    [算法]处理连续小段问题
    [动态规划]最长回文子串
    违法
    TCP的拥塞控制
    SpringBank 开发日志 一种简单的拦截器设计实现
    SPFILEOPENBANKDB.ORA 手动编辑产生问题
    springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7237773.html
Copyright © 2011-2022 走看看