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;
}
微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值