程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3328 Flipper (stack)

HDU 3328 Flipper (stack)

編輯:C++入門知識

最近著手打基礎,做做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\n",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.\n",s[final][n - a]);  
            else printf("face up %d.\n",s[final][n - a]);  
        }  
    }  
    return 0;  
}  

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved