zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    449. Serialize and Deserialize BST
    114. Flatten Binary Tree to Linked List
    199. Binary Tree Right Side View
    173. Binary Search Tree Iterator
    98. Validate Binary Search Tree
    965. Univalued Binary Tree
    589. N-ary Tree Preorder Traversal
    eclipse设置总结
  • 原文地址:https://www.cnblogs.com/hxer/p/5191406.html
Copyright © 2011-2022 走看看