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

 

posted @ 2017-07-26 09:13  列車員lcy  阅读(233)  评论(0编辑  收藏  举报