寫練習題的時候遇到這道題,是道簡單的模擬題,然後就直接寫了兩個隊列進行模擬,寫着寫着發覺有問題,還需要標記模擬過程中產生的新隊列,於是趕緊修改代碼,在想如何標記的時候嘗試了很多中方法,其中不乏該題最水的ac方法,即循環足夠多的次數可以ac。最後我用了map對每個新隊列進行標記。
題目大意:兩個人打牌,從自己的手牌中抽出最上面的一張比較大小,大的一方可以拿對方的手牌以及自己打掉的手牌重新作爲自己的牌,放在自己手牌的最下方,而且對方輸掉的那張手牌需要放在上面,自己贏的手牌放在下面。輸入數據看題目網址,附鏈接:http://codeforces.com/contest/546/problem/C。
大體思路:簡單模擬,用兩個隊列進行模擬,然後用map數組標記出現過的序列。如果新序列和以前某個序列一樣,則輸出-1。具體代碼如下:
#include<iostream>
#include<string>
#include<queue>
#include<map>
using namespace std;
queue<int> q1,q2;
map<queue<int>,queue<int> > m;
int main(){
int n;
cin>>n;
int k1,k2;
cin>>k1;
int a;
for(int i=0;i<k1;i++){
cin>>a;
q1.push(a);
}
cin>>k2;
for(int i=0;i<k2;i++){
cin>>a;
q2.push(a);
}
m[q1]=q2;
int cnt=0;
while(!q1.empty()&&!q2.empty()){
int first=q1.front();
q1.pop();
int second=q2.front();
q2.pop();
if(first<second){
q2.push(first);
q2.push(second);
}
else{
q1.push(second);
q1.push(first);
}
cnt++;
if(m.count(q1)&&m[q1]==q2){
/*一開始我用的是m[q1]=q2,不過過不了,然後直接用m.count(q1),也wa了,最後兩個結合才ac
具體還不知道什麼原因,初步估計是map本身的問題,以後有機會我會對map進行一下實驗,
這裏註釋,免得自己忘了*/
cnt=-1;
break;
}
else
m[q1]=q2; //記錄新的序列
}
if(cnt==-1)
cout<<-1<<endl;
else{
cout<<cnt;
if(q1.empty())
cout<<' '<<2<<endl;
else
cout<<' '<<1<<endl;
}
return 0;
}