题目描述
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。
输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。
输出描述:
输出保留下来的结果。
示例1
输入
325 1
输出
35
本题初看简单,做起来有点复杂,总体来说就是一位一位的取数找出第一位能取的最大数,保存接着取第二位然后第三位...
代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <set>
#include <string>
#include <queue>
#include <vector>
#define ll long long
#define Max 100005;
using namespace std;
int main()
{
string str,str1;
cin>>str;
int n;
cin>>n;
int mn=n;
queue <int>a[20];
for(int i=0;i<str.length();i++)///保存每个数字所在位置
{
a[str[i]-'0'].push(i+1);
}
int be=0;
while(n){
int s=1;
for(int i=9;i>=0;i--)
{
while(!a[i].empty())///每位取所能取到的最大数
{
int m=a[i].front();
int ls=m;
if(m<be)///表示该数所在位置已经被舍弃了
{
a[i].pop();
continue;
}
m=m-be-1;///表示如果该数可取应该删除的数的个数
if(m<=n){///表示当前最大数可取
n=n-m;///表示还要舍弃多少个数
be=ls;///be前面的数都被删除
str1+=str[ls-1];///保存所取的数
a[i].pop();
s=0;///标记当前位取过了
break;
}
else{///表示当前最大数不可取
break;
}
if (str1.length()==(str.length()-mn))///判断是否已经取够,取够则退出
break;
}
if (str1.length()==(str.length()-mn))
break;
if(n==0)///判断是否舍弃够n个数
break;
if(s==0)///判断当前位是否取过,如果取过应该取下一位(下一位从9开始取)。否则当前位接着判断i-1是否可取
break;
}
if (str1.length()==(str.length()-mn))
break;
}
if(n==0)///可能没取到最后一位就已经舍弃够n个数那么直接把be后面的数都加上即可
{
str=str.substr(be,str.length()-be);
str1+=str;
}
cout<<str1<<endl;
return 0;
}