题目链接:

http://codeforces.com/problemset/problem/546/C

题意:

总共有n张牌,1手中有k1张分别为:x1, x2, x3, ..xk1,2手中有k2张,分别为:y1, y2, ...yk2;(n<=10&&k1+k2==n,所有牌的数字都不同);

依次比较x1, y1的大小,若x1>y1,依次将x1, y1加入x牌最底下;反之则将y1,x1依次加入y牌最底下;直至有方的牌输完为止;输出总共游戏的步数和赢方;

如果两方都不能赢,则输出-1;

思路:直接用栈模拟,关键的地方是判断两方都不能赢的情况,判断方法有两种:

其一是设一个足够大的数,超过这个步数还没有分出输赢情况的话则可以认定

两方都不能赢,因为n<=10,如果能分出输赢的话则500步以内一定会出结果的!

另一种方法是判断当前状态之前是否出现过,若出现过,则其一定不能分出输赢!会死循环!

至于如何判断是否出现过,可以将每个状态都存入一个string数组中,再将当当前状态与之对比,若出现过,则平局;

代码分别如下:

方法1:

 1 #include<bits/stdc++.h>
 2 #define MAXN 10000
 3 #define MAX 1000000000
 4 #define eps 1e-6
 5 #define ll long long
 6 using namespace std;
 7
 8 int main(void)
 9 {
10     queue<int> stk1, stk2;
11     string str1[MAXN], str2[MAXN];
12     int n, a, b, ans=0;
13     cin >> n;
14     cin >> a;
15     for(int i=0; i<a; i++)
16     {
17         int x;
18         cin >> x;
19         stk1.push(x);
20     }
21     cin >> b;
22     for(int i=0; i<b; i++)
23     {
24         int x;
25         cin >> x;
26         stk2.push(x);
27     }
28     int cnt=0, flag;
29     while(1)
30     {
31         int x=stk1.front(), y=stk2.front();
32         if(x>y)         //****如果x>y,将y, x依次从队尾加入stk1队列,并将stk2,stk1队首元素y, x抛掉;
33         {
34             stk1.push(y);
35             stk1.push(x);
36             stk1.pop();
37             stk2.pop();
38         }
39         else         //****如果x<y,将x, y依次从队尾加入stk2队列,并将stk2, stk1队首元素y, x抛掉;
40         {
41             stk2.push(x);
42             stk2.push(y);
43             stk2.pop();
44             stk1.pop();
45         }
46         cnt++;
47         if(stk1.empty())   //****队列stk1为空,即2赢了
48         {
49             cout << cnt << " " << "2" << endl;
50             return 0;
51         }
52         if(stk2.empty())  //****队列stk2为空,即1赢了
53         {
54             cout << cnt << " " << "1" << endl;
55             return 0;
56         }
57         if(cnt>500) break; //****如果步数大于500还没分输赢,即可判平局
58     }
59     cout << "-1" << endl;
60     return 0;
61 }

方法2:

 1 #include<bits/stdc++.h>
 2 #define MAXN 10000
 3 #define MAX 1000000000
 4 #define eps 1e-6
 5 #define ll long long
 6 using namespace std;
 7
 8 int main(void)
 9 {
10     queue<int> stk1, stk2;
11     string str1[MAXN], str2[MAXN];
12     int n, a, b, ans=0;
13     cin >> n;
14     cin >> a;
15     for(int i=0; i<a; i++)
16     {
17         int x;
18         cin >> x;
19         stk1.push(x);
20     }
21     cin >> b;
22     for(int i=0; i<b; i++)
23     {
24         int x;
25         cin >> x;
26         stk2.push(x);
27     }
28     int cnt=0, flag;
29     while(1)
30     {
31         int low1[MAXN], low2[MAXN], k1=0, k2=0;
32         while(!stk1.empty())   //**将stk1存入string数组中
33         {
34             low1[k1++]=stk1.front();
35             stk1.pop();
36         }
37         for(int i=0; i<k1; i++)
38         {
39             stk1.push(low1[i]);
40         }
41         for(int i=0; i<k1; i++)
42         {
43             str1[cnt]+=to_string(low1[i]);
44         }
45         while(!stk2.empty())   //****将stk2存入string数组中
46         {
47             low2[k2++]=stk2.front();
48             stk2.pop();
49         }
50         for(int i=0; i<k2; i++)
51         {
52             stk2.push(low2[i]);
53         }
54         for(int i=0; i<k2; i++)
55         {
56             str2[cnt]+=to_string(low2[i]);
57         }
58         for(int i=0; i<cnt; i++)       //***判断当前状态是否出现过,若出现过,则平局
59         {
60             if(str1[i]==str1[cnt]&&str2[i]==str2[cnt])
61             {
62                 cout << "-1" << endl;
63                 return 0;
64             }
65         }
66         int x=stk1.front(), y=stk2.front();
67         if(x>y)        //****如果x>y,将y, x依次从队尾加入stk1队列,并将stk2,stk1队首元素y, x抛掉;
68         {
69             stk1.push(y);
70             stk1.push(x);
71             stk1.pop();
72             stk2.pop();
73         }
74         else       //****如果x<y,将x, y依次从队尾加入stk2队列,并将stk2, stk1队首元素y, x抛掉;
75         {
76             stk2.push(x);
77             stk2.push(y);
78             stk2.pop();
79             stk1.pop();
80         }
81         cnt++;
82         if(stk1.empty())   //****队列stk1为空,即2赢了
83         {
84             flag=2;
85             break;
86         }
87         if(stk2.empty())    //****队列stk2为空,即1赢了
88         {
89             flag=1;
90             break;
91         }
92     }
93     cout << cnt << " " << flag << endl;
94     return 0;
95 }

转载于:https://www.cnblogs.com/geloutingyu/p/5897305.html

Codeforces Round #304 C(Div. 2)(模拟)相关推荐

  1. 水题 Codeforces Round #304 (Div. 2) A. Soldier and Bananas

    题目传送门 1 /* 2 水题:ans = (1+2+3+...+n) * k - n,开long long 3 */ 4 #include <cstdio> 5 #include < ...

  2. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)切题报告(A-B题)

    这是我第二次参加CF比赛,也是第一次写博客,写得不好,望各位大佬海涵. A. Single Wildcard Pattern Matching 原题链接 这道题,这是难到让人无法直视,太水了. 题目大 ...

  3. [区间记忆化dp入门][Bribe the Prisoners SPOJ - GCJ1C09C][Codeforces Round #505D (rated, Div. 1 + Div. 2, ba]

    Bribe the Prisoners SPOJ - GCJ1C09C 作为这类题代表,f[i][j]代表第i点到第j点单独处理的最值 这题关键:释放某个囚犯后,就把囚犯分成两段,两段互相独立 这类d ...

  4. Codeforces Round #626(Div.2) 解题报告

    Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) [前言] 最近沉迷只狼,好久没有打CF了,水平 ...

  5. Codeforces Round #304 (Div. 2) D. Soldier and Number Game 数学 质因数个数

    D. Soldier and Number Game Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/conte ...

  6. codeforces水题100道 第五题 Codeforces Round #304 (Div. 2) A. Soldier and Bananas (math)

    题目链接:http://www.codeforces.com/problemset/problem/546/A 题意:一个人现在有n元,它买第i根香蕉需要i*k元,问他要买w根香蕉的话,需要问他的朋友 ...

  7. Codeforces Round #304 (Div. 2)

    这次打得较差,差点就绿了... B题,这B题竟然WA了,再看看就发现一个很严重的错误..--! #include <iostream> #include <cstdio> #i ...

  8. 【补题计划】Codeforces Round #533+#534(Div.2)

    #533 D. Kilani and the Game 模拟一个游戏,每轮每个玩家可以把距离他拥有的领地的ki步内的格子占领,不能跨越别人的领地以及障碍,问最终每个人占领多少个格子. 写了好几种写法, ...

  9. Codeforces Round #470 (rated, Div. 2 C. Producing Snow(思维)

    C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input standard in ...

最新文章

  1. java list 速度_Java中的List你真的会用吗?不会用的话请收藏我的这篇文章
  2. Python学习笔记:循环语句
  3. 17 合作伙伴角色‘OA’不允许用于科目组xxxx的供应商
  4. 02.友盟项目--原始日志数据生成
  5. 锤子t1重置后怎么显示无服务器,解决锤子手机smartisanT1关机后无法正常开机(附带刷机教程图文)...
  6. 整个线上营销_而言,最重要的是什么?
  7. iview上传文件案例
  8. 完美的xslt数值函数与字符串函数
  9. python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
  10. 信用评分卡模型分析(基于Python)--理论部分
  11. HTML+JS调用摄像头
  12. VMware利用unlocker开启MacOS支持
  13. Chrome 下载文件出现已禁止
  14. 快播CEO认罪_成人网站对技术的要求有多高?
  15. 回声消除技术--整理编
  16. 阿里云MVP精选2018年终盘点:大咖专访+最佳实践,丰富干货等你来!
  17. 用文氏图表示映射满射单射及函数的关系
  18. php面试兴趣爱好,简历中的兴趣爱好该怎么写?
  19. php 数值转时间格式,php数值转换时间及时间转换数值用法示例
  20. tesseract安装使用

热门文章

  1. 利用js对页面数据进行排序
  2. win10系统Mysql5.7服务启动报:1053错误:服务没有及时响应启动或控制请求
  3. Python_logging模块
  4. python学习之--安装IDE(eclipse+pydev)
  5. 复杂的xml转化为java实体
  6. ANTLR 4的C#实例
  7. 分布式缓存DistributedCache的使用
  8. lintcode-easy-Insertion Sort List
  9. Linux 信号随笔
  10. R3获取kernel32地址