• 2017第十三届湖南省省赛B


    在一次聚会上,Bob打算和Alice一起玩Blackjack游戏,但Alice平时很少玩扑克类游戏,Bob觉得跟Alice解释清楚Blackjack的规则有点困难,于是Bob决定和Alice玩一次简化版的Blackjack。

    点数计算

    游戏过程使用若干副去掉大小王的扑克牌,A代表1点,2-10即为牌面上的点数,J、Q、K均代表10点。

    发牌

    游戏包含两位玩家,一位玩家做庄家负责发牌, 另一位玩家为闲家。 发牌时依次派发牌堆最上方的牌。 庄家会向闲家派发一张暗牌(即不被揭开的牌), 然后向自己派发一张暗牌, 接着庄家会向闲家派发一张明牌(即被揭开的牌), 然后又向自己派发一张明牌。 之后庄家会询问闲家是否继续要牌,并以明牌的形式派发。 闲家在看完自己的暗牌和明牌之后决定是否继续要牌。

    爆煲

    如果闲家要牌后手上拥有的牌的总点数超过21点(俗称爆煲),便要揭开手上所有的牌,算作庄家赢。 如果闲家手上拥有的牌的总点数不超过21点, 该闲家可决定是否继续要牌。 当闲家决定不再要牌后,庄家就必须揭开自己手上所有的牌,然后决定是否继续要牌,直到爆煲或者决定不再要牌为止。 如果庄家爆煲,算作闲家赢。

    点数决胜

    如果庄家最终没有爆煲,闲家便要揭开手上所有的牌,比较点数决定谁胜谁负。 如果闲家的点数比庄家大,算作闲家赢。 如果闲家的点数和庄家相等或者比庄家小,则算作庄家赢。

    现在Bob是庄家,Alice是闲家,在Bob开始发牌的时候Alice借助好朋友Cara的超能力已经知道了牌堆最上方的若干张牌,Alice想知道她是否一定可以赢下这一局呢?

    Input

    输入包含不超过100组数据。 每组数据的第一行为一个整数n(5 ≤ n ≤ 42),即Alice已经知道的牌的数量。 接下来一行包含n个1-13之间的整数,依次描述了牌堆从上至下最上方的n张牌的牌面。 这里我们用整数1代表扑克牌的A,整数11、12、13分别代表扑克牌的J、Q、K。 数据保证这n张牌的总点数不少于42。

    Output

    对于每组数据,如果Alice一定可以赢下这一局,输出“Yes”,否则输出“No”。

    Sample Input

    9
    12 5 13 5 2 7 3 1 5
    9
    5 13 5 5 5 5 1 3 4
    5
    11 11 11 11 2
    8
    8 11 9 6 2 3 2 4

    Sample Output

    Yes
    Yes
    No
    No

    Hint

    对于第一个样例,Alice手中的暗牌和明牌分别为Q、K,Bob手中的暗牌和明牌分别为5、5。Alice选择不要牌即可,总点数为20,无论Bob接下来要几张牌,Alice都可以赢。

    对于第二个样例,Alice手中的暗牌和明牌分别为5、5,Bob手中的暗牌和明牌分别为K、5。Alice可以选择要三张牌,总点数为21,无论Bob接下来要几张牌,Alice都可以赢。Alice也可以选择只要两张牌,总点数为20,同样可以确保赢下这一局。

    对于第三个样例,Alice手中的暗牌和明牌分别为J、J,Bob手中的暗牌和明牌分别为J、J。Alice只能选择不要牌,否则会爆煲,总点数为20。此时Bob如果也不要牌,总点数为20,庄家赢。因此Alice不能保证一定可以赢Bob。

    对于第四个样例,Alice手中的暗牌和明牌分别为8、9,Bob手中的暗牌和明牌分别为J、6。无论Alice要几张牌,Bob都有可能赢Alice。

    题目很长,粗看一眼没有任何做的欲望(比赛时候就是这么想的)。

    坑点: 需要枚举每张牌,要或者不要。具体看代码吧!

    特殊数据: 10 8 6 2 3 10 13

    输出:Yes

    // Asimple
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <queue>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <set>
    #include <map>
    #include <cmath>
    #define INF 0x3f3f3f3f
    #define debug(a) cout<<#a<<" = "<<a<<endl
    #define test() cout<<"============"<<endl
    #define CLS(a,v) memset(a, v, sizeof(a))
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn = 105;
    const ll mod = 1000000007;
    int n, m, T, len, cnt, num, ans, Max, k; 
    int a[maxn];
    
    bool check(int x, int z, int i) {
        int t = i;
        while( x > z ) {
            z += a[t];
            t ++;
        }
        if( z>21 ) return true;
        return false;
    }
    
    void input(){
        while( cin >> n ) {
            CLS(a, 0);
            for(int i=1; i<=n; i++) {
                cin >> a[i];
                if( a[i]>10 ) a[i] = 10;
            }
            int x = a[1] + a[3];
            int z = a[2] + a[4];
            bool flag = false, f = false;
            for(int i=5; i<=n; i++) {
                if( check(x, z, i) ) {
                    flag = true;
                    break;
                } else {
                    if( !f ) {
                        if( x+a[i]>21 ) {
                            f = true;
                            i --;
                        } else x += a[i];
                    } else {
                        if( z+a[i]>21 ) {
                            break;
                        } else z += a[i];
                        //debug(z);
                    }
                }
            }
            //debug(x);
            if( flag || x>z ) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
    
    int main() {
        input();
        return 0;
    } 
  • 相关阅读:
    java方法参数传值传引用的一点看法
    Oracle触发器介绍
    CASE WHEN
    group by ,order by ,having
    Java中使用正则表达式
    Oracle 9i 分析函数参考手册
    ORACLE round 与 trunc 的区别
    oracle的默认表名长度(30)
    order by 使用索引的情况
    解析oracle的ROWNUM 作者: chen_liang
  • 原文地址:https://www.cnblogs.com/Asimple/p/7500404.html
Copyright © 2020-2023  润新知