ACM两个士兵打牌

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

42 1 32 4 2

Output

6 2

Input

31 22 1 3

Output

-1

解题思路:这个题目我们用队列来解决较好,我们先建立两个队列。解题的关键是我们每次都从两个队列中取出第一个元素,我们判断他们的大小,记住每次都要把队首的元素删除掉;把小的队的元素插入大的队的队尾再把他自己的元素插到后面,知道其中有一个队成为空的。,其中没有空的队就是胜出者。如果经过很多次的循环都没有对变成空的。这是就表示陷入循环,此时输出-1.

程序代码:

#include <iostream>

#include <queue>

using namespace std;

int main()

{

      queue<int>v;

      queue<int>w;

      int n,x,y,c,t,k=0,first=1;

      cin>>n;

      cin>>x;

      while(x--)

      {

            cin>>c;

            v.push(c);

      }

      cin>>y;

      while(y--)

      {

            cin>>c;

            w.push(c);

      }

      while(!v.empty()&&!w.empty())

      {

            if(k>1000)

            {

                  first=0;

                  break;

            }

            if(v.front()>w.front())

            {

                  v.push(w.front());

                v.push(v.front());

                v.pop();

                w.pop();

                  k++;

            }

          else

            {

                w.push(v.front());

                w.push(w.front());

                w.pop();

                v.pop();

                  k++;

            }

      }

      t=(v.empty()?2:1);

      if(first)

                  cout<<k<<" "<<t<<endl;

      else

            cout<<"-1"<<endl;      

      return 0;

}

  

时间: 2024-10-16 17:17:27

ACM两个士兵打牌的相关文章

[ACM]两个中位数

题目:         设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数.试设计一个O(logn)时间算法,找出X和Y的2n个数的中位数 思路: 1.要求时间为O(logn),所以应该是用分治法或递归 a: 1  3  5 7 9 中位数 am=5 b: 2 4 6 8 10  中位数bm=6 因为 am< bm 所以中位数必定在 579 和246中间 再取a',b'的中位数, 因为 am'=7 ,bm'=4  am'>bm' 所以中位数必定在 57 46 之间

CodeForces 546C(队列)

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

打牌~~~

题意: 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

【洛谷P1889】士兵站队

题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列成个水平队列,即排成 队列,即排成 (x,y),(x+1,y), -,(x+n -1,y) .如何选择 x 和y的值才能使 士兵们以最少的总移动步数排成一列. 输入输出格式 输入格式: 文件的第 1 行是士兵数 n,1≤n≤10000 .接下来 n 行是士兵的初始位置, 每行 2 个整数 x 和y,

1715 ACdream王国的士兵

Problem Description 所谓弱国无外交,ACdream王国想守住这一片土地,自然离不开王国的士兵们,你作为王国的骠骑大将军,自然有训练王国士兵的职责.王国有n个士兵,每个士兵都有两个属性,攻击和防御.然后你希望经过一系列的调整,每个士兵都能成为合格的军人,所谓合格的军人,是指他的攻击和防御之和大于等于k.你的调整办法就是交换两个士兵的同一种属性,即把两个士兵的攻击交换,或者防御交换,或者攻击和防御都交换(虽然这个没有意义).你的调整次数没有限制.请问你能否让所有的士兵都成为合格的

51nod 1441 士兵的数字游戏 (素数处理

1441 士兵的数字游戏 题目来源: CodeForces 基准时间限制:6 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 两个士兵正在玩一个游戏,游戏开始的时候,第一个士兵为第二个士兵选一个正整数n.然后第二个士兵要玩尽可能多的轮数.每一轮要选择一个正整数x>1,且n要是x的倍数,然后用n/x去代替n.当n变成1的时候,游戏就结束了,第二个士兵所得的分数就是他玩游戏的轮数. 为了使游戏更加有趣,第一个士兵用 a! / b! 来表示n.k!表示把所有1到k的数

洛谷——P1007 独木桥

P1007 独木桥 题目背景 战争已经进入到紧要时间.你是运输小队长,正在率领运输部队向前线运送物资.运输任务像做题一样的无聊.你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们.士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳一个人通过.假如有两个人相向而行在桥上相遇,那么他们两个人将无妨绕过对方,只能有一个人回头下桥,让另一个人先通过.但是,可以有多个人同时呆在同一个位置. 题目描述 突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为

河的第三岸

[巴西]若昂•吉马朗埃斯•罗萨 父亲是一个尽职.本分.坦白的人.据我认识的几个可以信赖的人说,他从小就这样.在我的印象中,他并不比谁更愉快或更烦恼.也许只是更沉默寡言一些.是母亲,而不是父亲,在掌管着我们家,她天天都责备我们——姐姐.哥哥和我. 但有一天,发生了一件事:父亲竟自己去订购了一条船. 他对船要求很严格:小船要用含羞草木特制,牢固得可在水上漂二三十年,大小要恰好供一个人使用.母亲唠叨不停,牢骚满腹,丈夫突然间是想去做渔夫或猎人吗?父亲什么也没说.离开我们家不到一英里,有一条大河流经,水

P1007 独木桥

题目背景 战争已经进入到紧要时间.你是运输小队长,正在率领运输部队向前线运送物资.运输任务像做题一样的无聊.你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们.士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳一个人通过.假如有两个人相向而行在桥上相遇,那么他们两个人将无妨绕过对方,只能有一个人回头下桥,让另一个人先通过.但是,可以有多个人同时呆在同一个位置. 题目描述 突然,你收到从指挥部发来的信息,敌军的轰炸机正朝着你所在的独木桥飞来!为了安全,你的部队必须