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\) 的牌的数量,并进行比较,若前者大于后者,则根据题目要求,游戏也是无法进行的,否则可以继续游戏。

这道题的翻译是不是没解释的太清楚啊……yun 但是读懂题目之后思路还是不难想的。

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;
}
``
posted @ 2021-12-16 14:19  Eason_AC  阅读(55)  评论(0)    收藏  举报