题目:
问题描述
桌上有一些顺次叠放的书。有两个操作:一是在书堆顶上添加一本书;二是将最靠近顶端的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]; }
}
}
}