最近著手打基礎,做做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; }