← 返回题目页

A1871 [COCI 20172018 #1] Cezar【无数据】

标程

#include <bits/stdc++.h>
using namespace std;

// [COCI 2017/2018 #1] Cezar
//
// 牌堆:一副牌 52 张 = 13 种牌面 × 4 张花色。
// 按「点数」看:2..9 各 4 张;10/J/Q/K 都是 10 点,共 16 张;A 是 11 点,4 张。
// 抓走的牌只给出点数,所以按点数统计剩余张数即可(点数 10 的那 16 张少一张都一样)。
//
// 决策:X = 21 - 已抓牌点数和。
// 剩余牌中点数 > X 的张数 >= 点数 <= X 的张数 → 停止(DOSTA),否则继续抓(VUCI)。

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    cin >> N;

    // cnt[v]:牌堆里点数为 v 的牌还有多少张
    int cnt[13] = {0};
    for (int v = 2; v <= 11; v++) cnt[v] = 4;
    cnt[10] = 16;  // 10、J、Q、K 都是 10 点

    int sum = 0;
    for (int i = 0; i < N; i++) {
        int v;
        cin >> v;
        sum += v;
        if (v >= 2 && v <= 11) cnt[v]--;
    }

    int X = 21 - sum;
    int big = 0, small = 0;
    for (int v = 2; v <= 11; v++) {
        if (v > X) big += cnt[v];
        else small += cnt[v];
    }

    cout << (big >= small ? "DOSTA" : "VUCI") << "\n";
    return 0;
}

动画演示