删数游戏
时间限制: 1 Sec 内存限制: 128 MB
提交: 28 解决: 9
[提交][状态][讨论版]
题目描述
小明和小华玩一个游戏。小明写下一个N位的正整数,小华要删除其中的K位,求它能得到的最大的数是多少?
输入
第一行两个整数N和K(1<=K<=N<=500000)
接下来一个N位数,没有前导0.
输出
一行,表示剩下的最大的数。
样例输入
5 2
53019
样例输出
539
分析:
方法其实就是贪心,从前往后找第一个递增的数,删掉这个数,但是这道题极其坑爹,有灰常多细节:
1:如果删数到了k个,退出循环
2:如果遍历完后删数没有达到k个,输出现有序列的前n-k个
3:等于的情况不删! 例如:2213 删掉一个,应输出223而不是213
4:注意范围,常规方法要超时!
所以为了避免每找到一个数就把后面的往前移,我们选择用栈来储存,实现如下:(一定要注意细节)
#include<cstdio>
#include<stack>
using namespace std;
int n,k,s;
stack<char>a;
int main()
{
char c[500005];
scanf("%d%d%s",&n,&k,c);
a.push(c[0]);
int i,o=0;
for(i=1;i<n&&s<k;i++)
{
while(!a.empty()&&s<k)
if(a.top()<c[i]) s++,a.pop();
else break;
a.push(c[i]);
}
if(s==k)
for(;i<n;i++) a.push(c[i]);
while(!a.empty()) c[o++]=a.top(),a.pop();
for(i=o-1;n-k>=o-i;i--)
printf("%c",c[i]);
}