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