• hdu 3183 A Magic Lamp


    A Magic Lamp

    题意:不能改变数字序列的顺序,从n个数中删除m个,输出删除后最小的数;(m<n<=1000)输出忽略前导0;

    分析:这道题其实数据范围可以达到1e6;看很多人的题解都是ST或者是RMQ,其实是一道单调栈的题;O(n)的算法。

    简单讲讲单调栈的思想:要求的是删除后最小的,那么当现在是第i个数字入栈时,如果栈顶元素比s[i]大(栈顶元素输出时在s[i]的前面),那么是不是栈顶元素就没有继续待下去的必要了呢。这就是使用贪心的方法;一直出栈到栈顶的元素比s[i]小才将s[i]入栈。其实单调栈给了每一个元素机会,即每一个元素都入栈了,只是最后还在栈中的元素就是最后的答案了;

    ps:最好将答案一并存入ans[]中,不要部分保留在s[]中,因为要判断前导0;还有就是几个范围的判断;

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<stdlib.h>
    #include<time.h>
    #include<stack>
    #include<set>
    using namespace std;
    #define rep0(i,l,r) for(int i = (l);i < (r);i++)
    #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
    #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
    #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
    #define MS0(a) memset(a,0,sizeof(a))
    #define MS1(a) memset(a,-1,sizeof(a))
    #define inf 0x3f3f3f3f
    typedef __int64 ll;
    template<typename T>
    void read1(T &m)
    {
        T x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        m = x*f;
    }
    template<typename T>
    void read2(T &a,T &b){read1(a);read1(b);}
    template<typename T>
    void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
    template<typename T>
    void out(T a)
    {
        if(a>9) out(a/10);
        putchar(a%10+'0');
    }
    
    int main()
    {
        char s[1005],ans[1005];
        int n;
        while(scanf("%s%d",s,&n) == 2){
            int stk = 0,cnt = 0,i,len = strlen(s);
            for(i = 0;cnt < n && i < len;i++){
                while(stk && ans[stk] > s[i] && cnt < n) stk--,cnt++;//
                ans[++stk] = s[i];
            }
            if(cnt == n)
                rep0(j,i,len) ans[++stk] = s[j];
            else
                stk -= (n - cnt);
            int start = 0;
            rep1(i,1,stk)
                if(ans[i] != '0'){
                    start = i;
                    break;
                }
            if(!start) out(0);
            else rep1(i,start,stk)
                    putchar(ans[i]);
            puts("");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    java占位符
    linux安装jdk
    linux安装svn
    java判断是汉字和英文
    mysql删除未提交的事务
    Html 解决长串英文字母显示不能自动换行
    spring boot 定时任务
    mybatis批量插入数据
    文本域换行符号
    rabbitmq,生成者和消费者
  • 原文地址:https://www.cnblogs.com/hxer/p/5191406.html
Copyright © 2020-2023  润新知