• 【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;
    }
  • 相关阅读:
    Android Studio踩的坑之导入别人的Android Studio项目
    获取已发布微信小游戏和小程序源码
    小程序第三方框架对比 ( wepy / mpvue / taro )
    项目中常用的MySQL 优化
    最全反爬虫技术
    MySQL Explain详解
    php接口安全设计
    PHP进程间通信
    PHP进程及进程间通信
    springBoot优雅停服务配置
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998744.html
Copyright © 2020-2023  润新知