题目来源:http://115.29.212.188/problem/COCI-1282
题目:
纸牌游戏
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:普及/提高-
分数:100 OI排行榜得分:14(0.1*分数+2*难度)
出题人:root
描述
小凯撒喜欢玩纸牌游戏,每次他去萨格勒布都会和他的朋友们玩 21 点,这是一种很流行的纸牌游戏。
这个游戏的规则是,在纸牌点数之和小于 21 点之前可以连续抓牌,如果决定不抓牌,则喊 DOSTA
。
游戏开始时,桌面有 52 张牌 —— 13 种不同牌面的牌,每种有 4 个花色。牌面分别是 2,3,…,J,Q,K,A。它们的点数计算规则是:牌面上的数字就是点数(比如,9 的点数就是 9),特殊地,J,Q,K 都算 10 点,A 算 11 点。
凯撒认为游戏的乐趣在于,当抓了 N 张牌之后,如果点数之和小于或等于 21,他就要思考是否要再多抓一张。假设 X 是已抓牌点数之和与 21 之间相差的点数值,我们知道,如果桌面上的剩余牌中点数大于 X 的纸牌数量比小于等于 X 的纸牌数量要多,或两者一样多,那就不应该再抓牌了。
因为凯撒并不擅于计算是否需要抓牌,所以他请你帮他计算和决策。
输入描述
第一行输入一个正整数 N(1≤N≤52),表示凯撒已经抓牌的张数。
接下来 N 行每行一个正整数,第 i 个正整数是他抓的第 i 张牌点数值。
输出描述
如果凯撒应该继续抓牌,输出 VUCI
,否则输出 DOSTA
。
用例输入 1
6 2 3 2 3 2 3
用例输出 1
DOSTA
用例输入 2
1 10
用例输出 2
VUCI
用例输入 3
2 5 6
用例输出 3
VUCI
提示
【样例解释】
第一个样例: 已经抓的 6 张牌的总点数是 15,它与 21 的差 X 是 6。桌面上剩余牌中比 6 大的牌有 32 张(分别是 4 张 A、4 张 K、4 张 Q、4 张 J、4 张 10、4 张 9、4 张 8、4 张 7),而比 6 小的牌有 14 张(分别是 1 张 2、1 张 3、4 张 4、4 张 5、4 张 6),所以决定不再抓牌,输出 DOSTA
。
经过思考,答案:
#include<bits/stdc++.h>
using namespace std;
int t[15] = {0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 16, 4};
int main() {
int n;
cin >> n;
int tmp = 21;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
tmp -= x;
t[x]--;
}
int a = 0, b = 0;
for (int i = 2; i <= 11; i++) {
if (i > tmp) b += t[i];
if (i <= tmp) a += t[i];
}
if (b > a || a == b) cout << "DOSTA" << endl;
else cout << "VUCI" << endl;
return 0;
}