Soldier and Cards(CF #304 Div.2)

29 篇文章 0 订阅
11 篇文章 0 订阅

写练习题的时候遇到这道题,是道简单的模拟题,然后就直接写了两个队列进行模拟,写着写着发觉有问题,还需要标记模拟过程中产生的新队列,于是赶紧修改代码,在想如何标记的时候尝试了很多中方法,其中不乏该题最水的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(当时随便写的,没想到过了)微笑。。。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值