题目链接:

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:

 #include<bits/stdc++.h>
#define MAXN 10000
#define MAX 1000000000
#define eps 1e-6
#define ll long long
using namespace std; int main(void)
{
queue<int> stk1, stk2;
string str1[MAXN], str2[MAXN];
int n, a, b, ans=;
cin >> n;
cin >> a;
for(int i=; i<a; i++)
{
int x;
cin >> x;
stk1.push(x);
}
cin >> b;
for(int i=; i<b; i++)
{
int x;
cin >> x;
stk2.push(x);
}
int cnt=, flag;
while()
{
int x=stk1.front(), y=stk2.front();
if(x>y) //****如果x>y,将y, x依次从队尾加入stk1队列,并将stk2,stk1队首元素y, x抛掉;
{
stk1.push(y);
stk1.push(x);
stk1.pop();
stk2.pop();
}
else //****如果x<y,将x, y依次从队尾加入stk2队列,并将stk2, stk1队首元素y, x抛掉;
{
stk2.push(x);
stk2.push(y);
stk2.pop();
stk1.pop();
}
cnt++;
if(stk1.empty()) //****队列stk1为空,即2赢了
{
cout << cnt << " " << "" << endl;
return ;
}
if(stk2.empty()) //****队列stk2为空,即1赢了
{
cout << cnt << " " << "" << endl;
return ;
}
if(cnt>) break; //****如果步数大于500还没分输赢,即可判平局
}
cout << "-1" << endl;
return ;
}

方法2:

 #include<bits/stdc++.h>
#define MAXN 10000
#define MAX 1000000000
#define eps 1e-6
#define ll long long
using namespace std; int main(void)
{
queue<int> stk1, stk2;
string str1[MAXN], str2[MAXN];
int n, a, b, ans=;
cin >> n;
cin >> a;
for(int i=; i<a; i++)
{
int x;
cin >> x;
stk1.push(x);
}
cin >> b;
for(int i=; i<b; i++)
{
int x;
cin >> x;
stk2.push(x);
}
int cnt=, flag;
while()
{
int low1[MAXN], low2[MAXN], k1=, k2=;
while(!stk1.empty()) //**将stk1存入string数组中
{
low1[k1++]=stk1.front();
stk1.pop();
}
for(int i=; i<k1; i++)
{
stk1.push(low1[i]);
}
for(int i=; i<k1; i++)
{
str1[cnt]+=to_string(low1[i]);
}
while(!stk2.empty()) //****将stk2存入string数组中
{
low2[k2++]=stk2.front();
stk2.pop();
}
for(int i=; i<k2; i++)
{
stk2.push(low2[i]);
}
for(int i=; i<k2; i++)
{
str2[cnt]+=to_string(low2[i]);
}
for(int i=; i<cnt; i++) //***判断当前状态是否出现过,若出现过,则平局
{
if(str1[i]==str1[cnt]&&str2[i]==str2[cnt])
{
cout << "-1" << endl;
return ;
}
}
int x=stk1.front(), y=stk2.front();
if(x>y) //****如果x>y,将y, x依次从队尾加入stk1队列,并将stk2,stk1队首元素y, x抛掉;
{
stk1.push(y);
stk1.push(x);
stk1.pop();
stk2.pop();
}
else //****如果x<y,将x, y依次从队尾加入stk2队列,并将stk2, stk1队首元素y, x抛掉;
{
stk2.push(x);
stk2.push(y);
stk2.pop();
stk1.pop();
}
cnt++;
if(stk1.empty()) //****队列stk1为空,即2赢了
{
flag=;
break;
}
if(stk2.empty()) //****队列stk2为空,即1赢了
{
flag=;
break;
}
}
cout << cnt << " " << flag << endl;
return ;
}

Codeforces Round #304 C(Div. 2)(模拟)的更多相关文章

  1. queue+模拟 Codeforces Round #304 (Div. 2) C. Soldier and Cards

    题目传送门 /* 题意:两堆牌,每次拿出上面的牌做比较,大的一方收走两张牌,直到一方没有牌 queue容器:模拟上述过程,当次数达到最大值时判断为-1 */ #include <cstdio&g ...

  2. DP+埃氏筛法 Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:b+1,b+2,...,a 所有数的素数个数和 DP+埃氏筛法:dp[i] 记录i的素数个数和,若i是素数,则为1:否则它可以从一个数乘以素数递推过来 最后改为i之前所有素数个 ...

  3. 贪心 Codeforces Round #304 (Div. 2) B. Soldier and Badges

    题目传送门 /* 题意:问最少增加多少值使变成递增序列 贪心:排序后,每一个值改为前一个值+1,有可能a[i-1] = a[i] + 1,所以要 >= */ #include <cstdi ...

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

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

  5. 数学+DP Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:这题就是求b+1到a的因子个数和. 数学+DP:a[i]保存i的最小因子,dp[i] = dp[i/a[i]] +1;再来一个前缀和 */ /***************** ...

  6. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 菜鸡只会ABC!

    Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 全场题解 菜鸡只会A+B+C,呈上题解: A. Bear and ...

  7. Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...

  8. Codeforces Round #581(Div. 2)

    Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...

  9. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A B C D 水 模拟 二分 贪心

    A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

随机推荐

  1. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

  2. Java Io 对象序列化和反序列化

    Java 支持将任何对象进行序列化操作,序列化后的对象文件便可通过流进行网络传输. 1.      对象序列化就是将对象转换成字节序列,反之叫对象的反序列化 2.      序列化流ObjectOut ...

  3. Codeforces 260 C. Boredom

    题目链接:http://codeforces.com/contest/456/problem/C 解题报告:给出一个序列,然后选择其中的一个数 k 删除,删除的同时要把k - 1和k + 1也删除掉, ...

  4. Android学习笔记(九)——布局和控件的自定义

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! View是 Android中一种最基本的 UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件 ...

  5. 用js判断页面是否加载完毕

    用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == "complete"判断是否加载完成 docum ...

  6. word20161204

    CA, certification authority / 证书颁发机构 cache / 高速缓存 cache file / 缓存文件 caching / 缓存 caching resolver /  ...

  7. auto与decltype

    今天搜狗笔试的一道选择题,原题给忘了,但记得所考的知识点.知识点很基础,但很容易忽视. 具体内容可参考C++ Primer. auto :变量取auto后,其所对应的类型        auto一般会 ...

  8. 单臂路由与三层交换机实现VLAN通信

    不同VLAN之间相互通信的两种方式 (单臂路由.三层交换) 试验环境:东郊二楼第三机房 试验设备:Catalyst 2950-24(SW3)                   Cisco 2611( ...

  9. Kali Linux渗透基础知识整理(一):信息搜集

    写在前面的废话:最近要给一些新人做培训,整理些东西,算不上什么太高端的内容,只是简单的整理下了,我觉得对于小白的话也还算是干货.在乌云水了几年,算不上什么大神水平,最近生活费紧张,现在打算在FreeB ...

  10. linux创建子进程--fork()方法

    (1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...