Soldier and Cards (队列)

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/B

题意

      给一个n(<=10)表示两人手中共有n张牌,接下来一行表示第1个人有k1张牌,k1 v1[1] v1[2]......v1[k1], v1[i]表示第i 张牌的大小,第三行表示第2个人 有k2张牌,k2 v2[1] v2[2].....v2[k2], v2[i]表示第i 张牌的大小。每一轮,两人从牌顶部各出一张,谁出的牌大则两张牌归谁,放入到自己牌的底部,直到其中一个人 手中没有牌出,则那个人输了。问需要多少轮,哪个人赢了。如果没有解则输出-1(k1 + k2 = n)

      案例:

      1)input

        4

        2 1 3

        2 4 2

        output

        6 2

      2)input

          3

          1 2

          2 1 3

          output

          -1

思路分析:

        利用queue函数。(先进先出)

        两个人的牌分为两队分别存入不同的queue类变量,取队首元素进行比较,更小的元素先入队到更大元素的尾部,再让更大的元素入对到它那队的最后,最后让两队的首元素出队。

        进行循环,如果其中有一队元素为空,则有人输了,跳出循环,如果循环次数超过了某个很大的数,则不会有结果,输出-1,跳出循环。

        如果第一队为空,第二个人赢输出次数和2。如果第二队为空,第一个人赢输出次数和1。

源代码如下:

 1 #include<iostream>

 2 #include<queue>

 3 using namespace std;

 4 int main()

 5 {

 6     int n,k1,k2,i,x1[20],x2[20],m=0;

 7     cin>>n;

 8     queue<int> q1,q2;

 9     cin>>k1;

10     for(i=0;i<k1;i++)

11     {

12         cin>>x1[i];

13         q1.push(x1[i]);

14     }

15     cin>>k2;

16     for(i=0;i<k2;i++)

17     {

18         cin>>x2[i];

19         q2.push(x2[i]);

20     }

21     while(1)

22     {

23         m++;

24         if(q1.front()>q2.front())

25         {

26             q1.push(q2.front());

27             q1.push(q1.front());

28             q1.pop();

29             q2.pop();

30         }

31         else

32         {

33             q2.push(q1.front());

34             q2.push(q2.front());

35             q1.pop();

36             q2.pop();

37         }

38         if(q1.empty()||q2.empty())break;

39         if(m>=100000)

40         {

41             cout<<"-1"<<endl;break;

42         }

43     }

44     if(q1.empty())cout<<m<<" 2"<<endl;

45     if(q2.empty())cout<<m<<" 1"<<endl;

46     return 0;

47 }

 

        

你可能感兴趣的:(IE)