• 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 }

            

  • 相关阅读:
    Object的公用方法
    Java的特点
    Set集合
    Java语言的三大特性
    List集合
    Collection类
    HashSet
    Codeforces1141F2 Same Sum Blocks (Hard)
    Codeforce1176F Destroy it!
    jzoj 5348. 【NOIP2017提高A组模拟9.5】心灵治愈
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4668719.html
Copyright © 2020-2023  润新知