SGU271. Book Pile(模拟)

本文详细介绍了如何通过一系列的add和rotate操作对书堆进行管理,并最终输出操作后的书堆状态。通过使用双端队列和栈的数据结构,有效地实现了对书堆的高效操作。文章深入分析了算法的核心思想和实现细节,为读者提供了实用的编程思路。
摘要由CSDN通过智能技术生成

题目请戳这里

题目大意:

一开始有n本书,书是垒起来放发,第一本在最上边。现在有m个操作,有2种操作类型:

add(xxx):将一本名为xxx的书放在书堆顶部;

rotate:将书堆顶部k本书颠个倒,如果当前书堆不足k本,则整个书堆颠倒。

自顶向下输出m个操作后的书堆。

题目分析:add操作很简单,随便弄一下就可以了。rotate操作的话,发现每次rotate操作只会影响堆顶的k本,所以将堆顶的k本拿出来,放到一个双端队列中,变向很方便。

多出来的从双端队列尾部放到一个栈中。最后逆序输出即可。

书名是字符串,所以直接对书的编号操作比较简单。

详情请见代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100005;
const int M = 40005;
int n,m,k,num,top,bot,nm,dir;
char name[N + M][5],op[20];
int ansque[N + M];
int mydeque[N + N + M];

void fuck()
{
    int i;
    gets(name[0]);
    num = nm = 0;
    dir = 1;
    top = N + M;
    bot = top + 1;
    for(i = n - 1;i >= 0;i --)
    {
        gets(name[num]);
        mydeque[-- bot] = num;num ++;
    }
    while(top >= bot && (top - bot) + 1 > k)
        ansque[nm ++] = mydeque[bot ++];
    while(m --)
    {
        gets(op);
        if(*op == 'A')
        {
            for(i = 4;op[i] != ')';i ++)
                if(isupper(op[i]))
                    name[num][i - 4] = op[i];
            name[num][i] = '\0';
            if(dir)
                mydeque[++ top] = num;
            else
                mydeque[-- top] = num;
            num ++;
            if(dir)
            {
                while(top >= bot && top - bot + 1 > k)
                    ansque[nm ++] = mydeque[bot ++];
            }
            else
            {
                while(top <= bot && bot - top + 1 > k)
                    ansque[nm ++] = mydeque[bot --];
            }
        }
        else
        {
            swap(top,bot);
            dir^=1;
        }
    }
    if(dir)
        for(i = top;i >= bot;i --)
            puts(name[mydeque[i]]);
    else
        for(i = top;i <= bot;i ++)
            puts(name[mydeque[i]]);
    for(i = nm - 1;i >= 0;i --)
        puts(name[ansque[i]]);
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&k) != EOF)
    {
        fuck();
    }
    return 0;
}
/*
2 3 0
A
B
ADD(C)
ROTATE
ADD(D)

2 3 1
A
B
ADD(C)
ROTATE
ADD(D)

2 3 2
A
B
ADD(C)
ROTATE
ADD(D)

2 3 3
A
B
ADD(C)
ROTATE
ADD(D)

2 3 4
A
B
ADD(C)
ROTATE
ADD(D)
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值