Soldier and Cards(CF #304 Div.2)

寫練習題的時候遇到這道題,是道簡單的模擬題,然後就直接寫了兩個隊列進行模擬,寫着寫着發覺有問題,還需要標記模擬過程中產生的新隊列,於是趕緊修改代碼,在想如何標記的時候嘗試了很多中方法,其中不乏該題最水的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;
}


另外一個思路是不用模板queue,直接開兩個數組進行模擬,不過也要進行標記。或者直接對可能出現的最多情況數進行循環,我當初水過時用的是200(當時隨便寫的,沒想到過了)微笑。。。



發佈了39 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章