http://codeforces.com/problemset/problem/546/C
两个人各有一堆牌,那堆牌各个数不一样。
如果a比b的大(牌顶),那么就先把b的放在牌下面,再把a自己的牌顶放到牌下面。
问你多少回合 可以赢,谁赢。
如果无法分出胜负,就输出-1.
为什么说这个模拟简单呢。。因为数据太小了,并且赤裸裸的队列啊。。
但是在判断是否能判断的情况,出现了一些差池,开始以为是最大的和最小的都在一堆里面便不能。后来发现不是啊 好多例子啊。。
后来又想到记忆化,如果有一个状态已经出现了又出现了一次,那么肯定是有循环的。但是在记录状态的情况下出现了丢失,常规想到壮压,但是壮压是不考虑顺序啊qwq。 于是呼一下wa。
1 因为数据很小,用字符串来表示就行。(不用哈希啊喂)
2 或者,,因为数据很小,所以直接设定一个时间限制就行。
10!的呗,如果经过t>这个,还是找不到结果,那么就肯定是循环啦
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ int tt,t;
int m,n;
scanf("%d",&tt);
scanf("%d",&m);
queue<char>s2;
queue<char>s1;
map<string,map<string,int> >mp;
int ans1=-1;
int anss1=1e4;
int ans2=-1;
int anss2=1e4;
int c;
string kk,kkk;
for(int i=0;i<m;i++){
cin>>c;
s1.push(c);
}
scanf("%d",&n);
for(int j=0;j<n;j++){
cin>>c;
s2.push(c);
}
bool flag=false;
t=0;
while(!s1.empty()&&!s2.empty()){
kk.clear();
kkk.clear();
queue<char>s=s1;
while(!s.empty()){
char u=s.front();
kk+=u;
s.pop();
}
queue<char >ss=s2;
while(!ss.empty()){
char u=ss.front();
kkk+=u;
ss.pop();
}
if(mp[kk][kkk]==1)
{ flag=true;break;
}
mp[kk][kkk]=1;
char u1=s1.front();
s1.pop();
char u2=s2.front();
s2.pop();
if(u1>u2){
s1.push(u2);
s1.push(u1);
}
else if(u2>u1){
s2.push(u1);
s2.push(u2);
}
t++;
}
if(flag)
puts("-1");
else{
printf("%d ",t);
if(s1.empty())
printf("2\n");
else
printf("1\n");
}
return 0;
}
第二个
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ int tt,t;
int m,n;
scanf("%d",&tt);
scanf("%d",&m);
queue<int>s2;
queue<int>s1;
set<pair< pair<long long ,long long >,bool> >se;
set<pair< pair<long long ,long long > ,bool> >::iterator ite;
int ans1=-1;
int anss1=1e4;
int ans2=-1;
int anss2=1e4;
int c;
ll kk,kkk;
for(int i=0;i<m;i++){
scanf("%d",&c);
ans1=max(ans1,c);
anss1=min(anss1,c);
//kk+=(1<<(c-1));
s1.push(c);
}
scanf("%d",&n);
for(int j=0;j<n;j++){
scanf("%d",&c);
ans2=max(ans2,c);
anss2=min(anss2,c);
s2.push(c);
//kkk+=1<<(c-1);
}
bool flag=false;
//dp[kk][kkk]=1;
t=0;
while(!s1.empty()&&!s2.empty()){
kk=0;
kkk=0;
/*if(s1.front()>s2.front())
ite=se.find(make_pair(make_pair(kk,kkk),true));
else
ite=se.find(make_pair(make_pair(kk,kkk),false));
if(ite!=se.end())
{flag=true;break;}
if(s1.front()>s2.front())
se.insert(make_pair(make_pair(kk,kkk),true));
else
se.insert(make_pair(make_pair(kk,kkk),false));*/
int u1=s1.front();
s1.pop();
int u2=s2.front();
s2.pop();
if(u1>u2){
s1.push(u2);
s1.push(u1);
}
else if(u2>u1){
s2.push(u1);
s2.push(u2);
}
t++;
if(t>1e6)
{flag=true;break;
}
}
if(flag)
puts("-1");
else{
printf("%d ",t);
if(s1.empty())
printf("2\n");
else
printf("1\n");
}
return 0;
}