LuoguP4419 [COCI2017-2018#1] Cezar 题解
Content
有一个牌库,有一些点数为 \(1\sim 11\) 的牌,其中除了点数为 \(10\) 的牌有 \(16\) 张之外,其余点数的牌各有四张。现在玩一个游戏,已经拿出了 \(n\) 张牌。游戏能够继续进行,需满足:
- 当前牌的点数和 \(S\leqslant 21\)。
- 设 \(x=21-S\),牌库剩余的牌中点数 \(>x\) 的牌的数量 \(<\) 点数 \(\leqslant x\) 的牌的数量。
问游戏能否继续进行。
数据范围:\(1\leqslant n\leqslant 52\)。
Solution
我们分几个部分进行:
第一部分,初始化当前牌的数量。这里应该很容易实现,故不再赘述。
第二部分,读入 \(n\) 张牌的点数,每读入完一张牌的点数,记录点数和 \(S\),并将相应点数的牌的数量减 \(1\)。
第三部分,判断 \(S\) 是否 \(>21\),如果大于 \(21\) 游戏就不能进行了,跳出程序。否则,继续统计剩余牌中点数 \(>x\) 的牌的数量和点数 \(\leqslant x\) 的牌的数量,并进行比较,若前者大于后者,则根据题目要求,游戏也是无法进行的,否则可以继续游戏。
这道题的翻译是不是没解释的太清楚啊……
但是读懂题目之后思路还是不难想的。
Code
int n, sum, x, a[57], cur[17], num1, num2;
int main() {
F(i, 1, 11) cur[i] = (i == 10 ? 16 : 4);
n = Rint;
F(i, 1, n) sum += (a[i] = Rint), cur[a[i]]--;
if(sum > 21) return printf("DOSTA"), 0;
x = 21 - sum;
F(i, 1, 11) {
if(i <= x) num2 += cur[i];
else num1 += cur[i];
}
return printf(num1 >= num2 ? "DOSTA" : "VUCI"), 0;
}
``

浙公网安备 33010602011771号