【栈】 删数游戏

删数游戏
时间限制: 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]);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序是一种基于数组实现的结构,它遵循先进后出(LIFO)的原则。顺序的特点是只能在顶进行插入和除操作,即只能在顶进行入和出操作。 C++中可以使用数组来实现顺序。下面是一个简单的顺序的实现示例: ```cpp #include <iostream> using namespace std; const int MAX_SIZE = 100; // 的最大容量 class SeqStack { private: int data[MAX_SIZE]; // 存储元素的数组 int top; // 顶指针 public: SeqStack() { top = -1; // 初始化顶指针为-1,表示为空 } bool isEmpty() { return top == -1; } bool isFull() { return top == MAX_SIZE - 1; } void push(int value) { if (isFull()) { cout << "Stack is full, cannot push element." << endl; return; } data[++top] = value; // 将元素插入到顶,并更新顶指针 } int pop() { if (isEmpty()) { cout << "Stack is empty, cannot pop element." << endl; return -1; } return data[top--]; // 返回顶元素,并更新顶指针 } }; int main() { SeqStack stack; stack.push(1); stack.push(2); stack.push(3); while (!stack.isEmpty()) { cout << stack.pop() << " "; } cout << endl; return 0; } ``` 关于百位数倒置,你是指将一个三位数的百位、十位和个位进行倒置吗?如果是的话,可以使用以下代码实现: ```cpp #include <iostream> using namespace std; int reverseNumber(int num) { int hundreds = num / 100; // 获取百位数 int tens = (num / 10) % 10; // 获取十位数 int ones = num % 10; // 获取个位数 return ones * 100 + tens * 10 + hundreds; // 百位、十位和个位倒置后的结果 } int main() { int num = 123; int reversedNum = reverseNumber(num); cout << "Reversed number: " << reversedNum << endl; return 0; } ``` 希望以上回答能够帮助到你!如果有任何疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值