CodeForces 546C(队列)
2015-07-26 19:14
232 查看
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u
Description
Two bored soldiers are playing card war. Their card deck consists of exactly n cards, numbered from 1 to n, all values are different. They divide cards between them in some manner, it's possible that they have different number of cards. Then they play a "war"-like card game.
The rules are following. On each turn a fight happens. Each of them picks card from the top of his stack and puts on the table. The one whose card value is bigger wins this fight and takes both cards from the table to the bottom of his stack. More precisely, he first takes his opponent's card and puts to the bottom of his stack, and then he puts his card to the bottom of his stack. If after some turn one of the player's stack becomes empty, he loses and the other one wins.
You have to calculate how many fights will happen and who will win the game, or state that game won't end.
Input
First line contains a single integer n (2 ≤ n ≤ 10), the number of cards.
Second line contains integer k1 (1 ≤ k1 ≤ n - 1), the number of the first soldier's cards. Then follow k1 integers that are the values on the first soldier's cards, from top to bottom of his stack.
Third line contains integer k2 (k1 + k2 = n), the number of the second soldier's cards. Then follow k2 integers that are the values on the second soldier's cards, from top to bottom of his stack.
All card values are different.
Output
If somebody wins in this game, print 2 integers where the first one stands for the number of fights before end of game and the second one is 1 or 2 showing which player has won.
If the game won't end and will continue forever output - 1.
Sample Input
Input
Output
Input
Output
程序分析:两个士兵打牌,按顺序出牌,若a的牌比b大,则把b的牌放到a的最后,再把a的这张牌放到b的那张排后面。很明显此题是队列问题可设置两个队列,按照题目意思模拟一下即可,注意在循环一定次数下仍然没有结果,则无解;另外就是可以直接标记状态搜索,可只标记第一个,也可以标记全部 程序代码:
Description
Two bored soldiers are playing card war. Their card deck consists of exactly n cards, numbered from 1 to n, all values are different. They divide cards between them in some manner, it's possible that they have different number of cards. Then they play a "war"-like card game.
The rules are following. On each turn a fight happens. Each of them picks card from the top of his stack and puts on the table. The one whose card value is bigger wins this fight and takes both cards from the table to the bottom of his stack. More precisely, he first takes his opponent's card and puts to the bottom of his stack, and then he puts his card to the bottom of his stack. If after some turn one of the player's stack becomes empty, he loses and the other one wins.
You have to calculate how many fights will happen and who will win the game, or state that game won't end.
Input
First line contains a single integer n (2 ≤ n ≤ 10), the number of cards.
Second line contains integer k1 (1 ≤ k1 ≤ n - 1), the number of the first soldier's cards. Then follow k1 integers that are the values on the first soldier's cards, from top to bottom of his stack.
Third line contains integer k2 (k1 + k2 = n), the number of the second soldier's cards. Then follow k2 integers that are the values on the second soldier's cards, from top to bottom of his stack.
All card values are different.
Output
If somebody wins in this game, print 2 integers where the first one stands for the number of fights before end of game and the second one is 1 or 2 showing which player has won.
If the game won't end and will continue forever output - 1.
Sample Input
Input
4 2 1 3 2 4 2
Output
6 2
Input
3 1 2 2 1 3
Output
-1
程序分析:两个士兵打牌,按顺序出牌,若a的牌比b大,则把b的牌放到a的最后,再把a的这张牌放到b的那张排后面。很明显此题是队列问题可设置两个队列,按照题目意思模拟一下即可,注意在循环一定次数下仍然没有结果,则无解;另外就是可以直接标记状态搜索,可只标记第一个,也可以标记全部 程序代码:
#include<iostream> #include<queue> using namespace std; const int N=1000; queue <int>x,y; int main() { int i,t,a,b,n,m; cin>>t; cin>>n; for( i=0; i<n; i++) { cin>>a; x.push(a); } cin>>m; for( i=0; i<m; i++) { cin>>b; y.push(b); } int s=0; while(!x.empty()&&!y.empty()) { s++; if(s>N) break; int q=x.front(); int p=y.front(); x.pop(); y.pop(); if(q<p) { y.push(q); y.push(p); } if(q>p) { x.push(p); x.push(q); } } if(x.empty()) cout<<s<<" "<<"2"<<endl; else if(y.empty()) cout<<s<<" "<<"1"<<endl; else cout<<"-1"<<endl; return 0; }
相关文章推荐
- python-文件输入输出
- linux内核bootsect.S和setup.S流程
- HDU 1937 J - Justice League
- JAVA设计模式之策略模式
- Python向MySQL批量插入数据
- 信息安全入门指南
- iOSUI篇--动画(Core Animation)总结
- [ExtJS5学习笔记]第22 Extjs5正在使用beforeLabelTpl添加所需的配置选项标注星号标记
- java 动态代理实现原理
- 判断中间目录是否存在
- 安卓与PC使用USB一种Socket通信方案
- HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
- mysql记录慢查询
- SQL Server 复制 订阅与发布
- JDBC URL中关于字符编码的配置参数
- 一、SDWebImage分析--库处理流程分析
- jsoup抓取数据
- Python学习日志之Python数据结构初识
- Poj2777(线段树+标记+状态压缩)
- HDUOJ Let the Balloon Rise 1004