在一次聚会上,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; }