Description
某天,Apple问起Gaga,”扑克牌排火车有没有玩过??”,”没有-_-“。Apple感到很不可思议,他决定马上教Gaga玩这个游戏。碍于手头上没有扑克牌,Apple就剪了几张卡片,然后在卡片上写上数字,然后对Gaga说“简单来讲,就是你有一堆牌,我有一堆牌,我们轮流出,每次把牌叠在上一次出的牌的下方,如果这时发现当前的牌与前面的牌有重复,那么这之间的牌就都归你了。这样到最后谁没有牌,谁就输了。”“oh,原来如此”。Gaga觉得这个也不过如此。
于是他们开始玩排火车了。。。
现在假设Apple和Gaga各有N张牌,Apple先出牌。请你给出一轮下来Apple和Gaga各获得的牌数。
Input
第一行T,表示T组测试数据,接下来有T部分。
每部分开头是一个整数N(1 <= N <= 50000),表示Apple和Gaga的牌数。接下来有2行,给出Apple和Gaga的牌的情况。首先给出Apple的牌,有N个整数,第i个整数xi(1 <= xi <= 100000)表示Apple的第i张牌面。其次给出Gaga的牌,格式类似。
Output
对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后输出 Apple和Gaga这一轮获得的牌数。
Sample Input
3 3 1 2 3 1 2 3 4 1 4 6 8 2 5 9 10 3 5 5 5 6 6 6
Sample Output
Case 1:Apple:0 Gaga:6 Case 2:Apple:0 Gaga:0 Case 3:Apple:3 Gaga:3
Hint
输入巨大,c++请使用scanf输入避免超时。
错误点:自己用两个数组模拟过程,因为要每次清空标记,没想到用容器来存储。。。脑子笨。然后一直超时,后改为容器后,又一直wa,不知道到底哪里错了。囧。看了其他人的代码,发现用栈来模拟过程相当简单,然后就借鉴了。
#include<stdio.h> #include<string.h> #include<algorithm> #include<stack> using namespace std; const int maxn=110000; int flag[maxn]; int a[maxn]; int main(){ int t,cnt=0; scanf("%d",&t); while(t--){ memset(flag,0,sizeof(flag)); int n,aa=0,bb=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i*2]); } for(int i=0;i<n;i++){ scanf("%d",&a[i*2+1]); } stack<int>S; while(!S.empty()){ S.pop(); } for(int i=0;i<2*n;i++){ if(!flag[a[i]]){ flag[a[i]]=1; S.push(a[i]); }else{ int tmp=0,num=0; while(!S.empty()){ tmp=S.top(); flag[tmp]=0; if(tmp!=a[i]){ S.pop(); num++; }else{ break; } } S.pop(); num+=2; if(i%2==0){ aa+=num; }else{ bb+=num; } } } printf("Case %d:Apple:%d Gaga:%d ",++cnt,aa,bb); } return 0; }