【蓝桥杯】算法提高 桌上的书

题目:

问题描述

  桌上有一些顺次叠放的书。有两个操作:一是在书堆顶上添加一本书;二是将最靠近顶端的k本书顺序翻转。(k是一开始就固定大的。)若不足k本书,则全部翻转。给出初始书叠放顺序和操作序列求出最终书的序列。

输入格式

  第一行三个数N, M, K,分别代表一开始书的数目、操作数、要翻转的书本数量。

  接下来N行,每行一个字符串代表书的名字,描述一开始的书堆情况。按从顶到底的顺序给出。

  接下来M行,如果该行是ADD(S)(S是一个字符串),则将书名为S的书放在书堆顶端。若是ROTATE,则进行翻转操作。

输出格式

  输出若干行,描述最终书堆情况。按从顶到底的顺序输出。

样例输入

2 3 2

A

B

ADD(C)

ROTATE

ADD(D)

样例输出

D

A

C

B

数据规模和约定

  0≤N≤40000, 0≤M≤100000, 0≤K≤40000. 书名不超过3个字符且全部为大写字母。书名可能重复。

思想:

没有思想,这道题就是纯纯考基本功的,楼主学java没多久,脑子也比较笨,不懂用哈希表和栈的查询,纯暴力解法,所幸给的范围不大,蓝桥杯上可以ac。

代码:

import java.util.Scanner;

public class Main 
{
    static int n;
    static int k;
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        int m=sc.nextInt();
        int op=m+n;    //这里保存初始n的值因为后面n在变化
        k=sc.nextInt();
        String a[]=new String[n+1];
        for(int i=n-1;i>=0;i--)
        {
            a[i]=sc.next();
        }
        String all[]=new String[op+1];
        for(int i=0;i<n;i++)
        {
            all[i]=a[i];
        }
        String b="ADD";
        String c="ROTA";
        String bc[]=new String[k+1];
        //添加

        //到此为止都还算是无脑,因为都是些基础设置
        for(int i=0;i<m;i++)
        {
            String s=sc.next();
            if(s.indexOf(b)!=-1)
            {
                all[n]=s.substring(s.indexOf(b)+4, s.length()-1);
                        n++;
            }
            if(s.indexOf(c)!=-1)
            {
                ROTATE(all,bc);
            }
        }
        for(int i=n-1;i>=0;i--)
        {
            System.out.println(all[i]);
        }
    }

//交换方法,注意边界设置
    static void ROTATE(String a[],String b[])
    {
        if(n>k)
        {
            for(int i=0;i<k;i++)
            {
                b[i]=a[n-i-1];
            }
            for(int j=n-k;j<n;j++)
            {
                a[j]=b[j-n+k];
            }
        }
        else
        {
            for(int i=0;i<n;i++)
            {
                b[i]=a[n-i-1];
            }
            for(int j=0;j<n;j++)
            {
                a[j]=b[j];            }
        }
        
        }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值