hdu 3328 Flipper 模拟题

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=110;
char c[maxn],e[maxn];
int a[maxn*4],b[maxn*4],f[maxn*4],t;
int st,en,st2,en2,x;
void addq(int q)
{
    int j;
    if(q&1)
    {
        for(j=st2+1;j<=en2;j++)
            f[t++]=b[j];
    }
    else
    {
        for(j=en2;j>st2;j--)
            f[t++]=b[j];
    }
}
void addp(int p)
{
    int j;
    if(p&1)
    {
        for(j=st+1;j<=en;j++)
            f[t++]=a[j];
    }
    else
    {
        for(j=en;j>st;j--)
            f[t++]=a[j];
    }
}
int main()
{
    int n,tt=0;
    while(cin>>n)
    {
        if(n==0)break;
        int i,j,k,m,p=0,q=0;
        cin>>c>>e;
        for(i=0;i<n-1;i++)
            if(e[i]=='L')p++;
            else q++;
        for(i=0;i<p;i++)
            if((p-i)&1)
            c[i]=c[i]=='U'?'D':'U';
        for(i=1;i<=q;i++)
            if((q-i+1)&1)
            c[n-i]=c[n-i]=='U'?'D':'U';
        st=en=st2=en2=200;
        for(i=1;i<=p;i++)
        {
            if(i&1)a[st--]=i;
            else a[++en]=i;
        }
        for(i=1;i<=q;i++)
        {
            if(i&1)b[st2--]=n-i+1;
            else b[++en2]=n-i+1;
        }
        t=0;
        if(e[n-2]=='R')
        {
            addq(q);
            addp(p);
            f[t++]=p+1;
        }
        else
        {
            addp(p);
            addq(q);
            f[t++]=p+1;
        }
        cout<<"Pile "<<++tt<<endl;
        cin>>m;
        while(m--)
        {
            cin>>x;
            cout<<"Card "<<x<<" is a face "<<(c[f[x-1]-1]=='U'?"up ":"down ")<<f[x-1]<<"."<<endl;
        }
    }
    return 0;
}
/*
    题意,将n张牌横向排开,从左到右编号1~n。输入正反情况,之后输入n-1次变化,变化L是将最左边的牌堆翻转覆盖到第二左的牌堆上;
同理R是从右开始。最后会成一堆牌。接着输入m个提问x,问从上到下第x张牌的情况。
    方法:思考可知,结果和L和R的顺序,可以直接模拟。我是找规律解得,根据L和R的个数p和q确定了n张牌翻转后的正反情况。接着前p张牌翻转必定
是先是奇数后偶数,奇数递减,偶数递增。或者牌的顺序逆序下。同理得到后q张的情况。最后根据最后一次的翻转确定p堆在上还是q堆在上

*/


你可能感兴趣的:(hdu 3328 Flipper 模拟题)