zoukankan      html  css  js  c++  java
  • 【HDU 4699】Editor【栈】

    题目大意:

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699
    一个打字机有5种功能:

    • I x:在光标后面插入x这个元素
    • R:将光标右移
    • L:将光标左移
    • Q x:输出前x个数字的连续最大和
    • D:删除光标的前一个数字

    思路:

    模拟栈。开两个栈ab,光标左边的数字放在a栈,光标右边的数字放在b栈。
    对于每一个操作:

    1. I x:在a中插入一个元素x,并且求出a的前缀和以及Q的答案。易得方程
      f[i]=max(f[i1],sum[i])
    2. R:将b栈的栈顶元素弹出并放入a栈中,同时像I操作一样求出sum[i]f[i]
    3. L:将a栈的栈顶元素弹出并放入b栈中,sum[i]f[i]清零
    4. Q x:直接输出f[x]
    5. D:将a栈栈顶元素弹出,sum[i]f[i]清零

    本题由多组测试数据!


    代码:

    #include <cstdio>
    #include <stack>
    #include <iostream>
    #include <cstring>
    #define Inf 1e8
    using namespace std;
    
    int n,x,k[1000001],f[1000001],m,sum[1000001];
    char c;
    stack<int> a;
    stack<int> b;
    
    int main()
    {
        while (scanf("%d",&n)==1)
        {
            while (a.size()) a.pop();
            while (b.size()) b.pop();
            f[0]=-Inf;
            sum[0]=0;
            m=0;  //初始化
            for (int j=1;j<=n;j++)
            {
                cin>>c;
                if (c=='I')
                {
                    m++;
                    scanf("%d",&k[m]);
                    a.push(k[m]);
                    sum[m]=sum[m-1]+k[m];
                    f[m]=max(f[m-1],sum[m]);
                }else
                if (c=='R')
                {
                    if (b.size()) 
                    {
                        m++;
                        x=b.top();
                        a.push(x);
                        b.pop();
                        sum[m]=sum[m-1]+x;
                        f[m]=max(f[m-1],sum[m]);
                    }   
                }else
                if (c=='L')
                {
                    if (a.size()) 
                    {
                        sum[m]=f[m]=0;
                        m--;
                        x=a.top();
                        b.push(x);
                        a.pop();
                    }
                }else
                if (c=='Q')
                {
                    scanf("%d",&x);
                    printf("%d\n",f[x]);
                }else
                if (c=='D')
                {
                    if (a.size())
                    {
                        a.pop();
                        sum[m]=f[m]=0;
                        m--;
                    } 
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998745.html
Copyright © 2011-2022 走看看