当前位置:编程学习 > C/C++ >>

HDU 4286 Data Handler(12天津网络赛-模拟)

题意:
给一列数字,一个左指针 L 和一个右指针 R。
然后有7种操作。
最后输出操作完的结果。
比赛时敲了2个小时才敲出来。。。各种弱。
解题思路:
观察这7种操作,我们发现,除了翻转,另外6种操作都是对于 L 或 R 这两点进行的。
这不就是双向队列么。
于是想到用三个队列来储存所有的数据:L 左边的,L 到 R 的,R 右边的。
对于翻转操作,用一个变量记录下当前的队列是正向还是逆向。
然后每次操作的时候,如果当前的队列是逆向的,则 L 相当于 R,R 相当于 L。
然后就没有然后了,模拟吧。
贴上我简化后的代码。
[cpp]
#include <deque> 
#include <stdio.h> 
#include <string.h> 
#include <algorithm> 
using namespace std; 
 
bool rev,first; 
 
deque<int> A,B,C; 
 
deque<int>::iterator it; 
 
int pop_Front(deque<int>& d) 

   int tmp = d.front(); 
   d.pop_front(); 
   return tmp; 

 
int pop_Back(deque<int>& d) 

   int tmp = d.back(); 
   d.pop_back(); 
   return tmp; 

 
void Print() 

    if(first) 
    { 
        first = false; 
        printf("%d",*it); 
    } 
    else 
        printf(" %d",*it); 

 
void Out() 

    first = true; 
    for(it=A.begin();it!=A.end();it++) 
        Print(); 
    if(!rev) 
        for(it=B.begin();it!=B.end();it++) 
            Print(); 
    else 
        for(it=B.end()-1;it!=B.begin()-1;it--) 
            Print(); 
    for(it=C.begin();it!=C.end();it++) 
        Print(); 
    puts(""); 

 
int main() 

    int L,R,Q,z,n,x; 
    scanf("%d",&z); 
    while(z--) 
    { 
        A.clear(); 
        B.clear(); 
        C.clear(); 
        rev = false; 
        scanf("%d",&n); 
        for(int i=1;i<=n;i++) 
        { 
            scanf("%d",&x); 
            B.push_back(x); 
        } 
        scanf("%d%d",&L,&R); 
        for(int i=1;i<L;i++) 
            A.push_back(pop_Front(B)); 
        for(int i=R+1;i<=n;i++) 
            C.push_front(pop_Back(B)); 
        scanf("%d",&Q); 
        char cmd[12],loc[5]; 
        while(Q--) 
        { 
            scanf("%s",cmd); 
            if(cmd[0] == 'R') 
            { 
                rev = !rev; 
                continue; 
            } 
            scanf("%s",loc); 
            if(cmd[0] == 'M') 
            { 
                if(cmd[4] == 'L')   //向左 
                { 
                    if(loc[0] == 'L') 
                    { 
                        x = pop_Back(A); 
                        !rev ? B.push_front(x) : B.push_back(x); 
                    } 
                    else 
                    { 
                        x = (!rev) ? pop_Back(B) : pop_Front(B); 
                        C.push_front(x); 
                    } 
                } 
                else            //向右 
                { 
                    if(loc[0] == 'L') 
                    { 
                        x = (!rev) ? pop_Front(B) : pop_Back(B); 
                &nb

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,