zoukankan      html  css  js  c++  java
  • book pile SGU

    有n本书从上到下摞在一起,有两种操作。ADD(C)表示把一本新书C放到这一摞书的最顶上,ROTATE表示将前K本书进行反转。在一系列操作后输出最后书的顺序

    分析:

    当时听别人讲这个题的时候很懵逼,后来自己读了一下题发现K是个固定的值,这样就好解决了

    每次反转操作只是针对于顶上的K个进行。

    我们可以用一个两个双端队列解决

    第一个双端队列储存前K本书,第二个双端队列(也可以是别的栈或者普通队列什么的因为不会再进行反转了)储存剩下的书。

    对于每个反转操作,只需要将双端队列的头和尾交换一下(并不是真的交换,用一个标记记录一下就可以了)

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <map>
     6 #include <queue>
     7 
     8 using namespace std;
     9 const int maxn=40000+10;
    10 string Name[maxn];
    11 deque<int>q1,q2;
    12 int front1,front2;//1正常0交换
    13 int n,m,k;
    14 int main(){
    15     scanf("%d%d%d",&n,&m,&k);
    16     string s;
    17     for(int i=1;i<=n;i++){
    18         cin>>s;
    19         Name[i]=s;
    20         q1.push_back(i);
    21     }
    22     front1=front2=1;
    23     for(int i=1;i<=n-k;i++){
    24         q2.push_front(q1.back());
    25         q1.pop_back();
    26     }
    27     for(int i=1;i<=m;i++){
    28         cin>>s;
    29         if(s=="ROTATE")front1=!front1;
    30         else{
    31             string NAME;
    32             bool judge=0;
    33             for(int j=0;j<s.length();j++){
    34                 if(s[j]=='('){judge=1;continue;}
    35                 if(s[j]==')'){judge=0;break;}
    36                 if(judge)NAME+=s[j];
    37             }
    38             ++n;
    39             Name[n]=NAME;
    40             if(front1){
    41             q1.push_front(n);
    42             if(q1.size()>k){
    43             q2.push_front(q1.back());
    44             q1.pop_back();
    45             }
    46             }else{
    47                 q1.push_back(n);
    48                 if(q1.size()>k){
    49                 q2.push_front(q1.front());
    50                 q1.pop_front();
    51                 }
    52             }
    53 
    54         }
    55     }
    56     while(!q1.empty()){
    57         int u;
    58         if(front1){
    59          u=q1.front();q1.pop_front();
    60         }
    61         else{
    62          u=q1.back();q1.pop_back();
    63         }
    64         cout<<Name[u]<<endl;
    65     }
    66     while(!q2.empty()){
    67         int u=q2.front();q2.pop_front();
    68         cout<<Name[u]<<endl;
    69     }
    70 return 0;
    71 }
    View Code
  • 相关阅读:
    Understanding about Baire Category Theorem
    Isometric embedding of metric space
    Convergence theorems for measurable functions
    Mindmap for "Principles of boundary element methods"
    Various formulations of Maxwell equations
    Existence and uniqueness theorems for variational problems
    Kernels and image sets for an operator and its dual
    [loj6498]农民
    [luogu3781]切树游戏
    [atAGC051B]Three Coins
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/8709868.html
Copyright © 2011-2022 走看看