Codeforces Round #304 (Div. 2)-C. Soldier and Cards-简单模拟

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值