• HDU 3328 Flipper (stack)


    最近着手打基础,做做STL的题目,虽然一般STL题目难度不大,但需要加快速度的准确率.............................


    本题有N张牌,一开始每个位置一张(正面朝上或者朝下),有N-1个操作,每次操作从有牌的最左边或者最右边,将那堆的牌由上到下依次翻转到旁边的那堆之中,操作结束,最后只剩一堆。

    在那一堆中执行Q次询问,由上到下,第几张牌初始状态的编号以及它现在是朝上还是朝下。


    直接开N个stack存好所有堆的状态......模拟操作即可。


    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include<functional>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <set>
    #include <queue>
    #include <stack>
    #include <climits>//形如INT_MAX一类的
    #define MAX 100005
    #define INF 0x7FFFFFFF
    using namespace std;
    
    int s[111][111];
    int head[111];
    int n,q;
    int numl,numr,final;
    char sta[111];
    char op[111];
    void init() {
        memset(s,0,sizeof(s));
        memset(head,0,sizeof(head));
        numl = 0; numr = 0;
    }
    
    void solve() {
        for(int i=1; i<=n; i++) {
            s[i][0] = i;
        }
        int len = strlen(op);
        int right , left;
        for(int i=0; i<len; i++) {
            if(op[i] == 'R') {
                numr ++;
                left = n - numr;
                right = left + 1;
                while(head[right] > -1) {
                    s[left][++head[left]] = s[right][head[right]--];
                }
            } else {
                numl ++;
                left = numl;
                right = left + 1;
                while(head[left] > -1) {
                    s[right][++head[right]] = s[left][head[left]--];
                }
            }
        }
    }
    
    bool judge(int x,int y) {
        int span = abs(x - y);
        if(span % 2 == 1) {
            if(sta[y-1] == 'U') sta[y-1] = 'D';
            else sta[y-1] = 'U';
        }
        if(sta[y-1] == 'U') return 1;
        return 0;
    }
    int main() {
        int a;
        int ca = 1;
        while(scanf("%d",&n) && n) {
            init();
            scanf("%s",sta);
            scanf("%s",op);
            scanf("%d",&q);
            solve();
            final = 1 + numl;
            printf("Pile %d
    ",ca++);
            for(int i=0; i<q; i++) {
                scanf("%d",&a);
                printf("Card %d is a ",a);
                if(judge(final,s[final][n - a]) == 0)printf("face down %d.
    ",s[final][n - a]);
                else printf("face up %d.
    ",s[final][n - a]);
            }
        }
        return 0;
    }
    


  • 相关阅读:
    我经历的IT公司面试及离职感受(转)
    一个优异的经理人,碰到糟糕的企业,最后往往存在的还是那间糟糕的企业(转)
    Android TextView和EditText属性详解
    Android EditText控件行尾为表情时的BUG
    Android安全问题 抢先拦截短信
    Android安全问题 抢先开机启动
    Android安全问题 抢先接收广播
    Android安全问题 抢先接收广播
    Android 监听EditView中的文本改变事件
    Android EditText中插入图片并响应点击事件
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3301728.html
Copyright © 2020-2023  润新知