#P1645. cards

cards

這應該是 PCOI 歷史上第一條通訊題。

2025/03/12 優化了部分分,細節在後面部分

題目背景

Alice 和 Bob 正在展示他們的「魔術技巧」。

首先 Alice 會隨機和獲得五張撲克牌,其中兩兩不重複且沒有鬼牌。

接著她會選擇其中四張牌而且依次展示給 Bob 看,然後 Bob 要猜出剩下的牌。

熱知識:一副撲克牌去掉兩張鬼牌後有 52 張牌,每張牌有一個花式和數值

花式 中文 英文
黑桃/葵扇 spade
紅心 heart
梅花 club
方塊/階磚 diamond

數值:A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K

題目描述

你需要寫兩段程序,一段是 Alice (程序A),一段是 Bob (程序B)。兩段程序會被寫進同一個檔案裡 (詳情見程序模板)。

例如, Alice 一開始有以下五張牌

  • 梅花 K
  • 黑桃 A
  • 紅心 9
  • 黑桃 3
  • 方塊 3

Alice 會選擇隱藏一張牌,例如

  • 黑桃 A

那麼 Alice 將會以特定順序地展示其餘四張牌,這個順序由 Alice 決定,例如

  1. 紅心 9
  2. 方塊 3
  3. 梅花 K
  4. 黑桃 3

Bob 會順序地看到這四張牌,並且要說出 Alice 隱藏的那一張牌,在這個例子就是

  • 黑桃 A

輸入/輸出格式

每一張牌的格式為 <花式> <數值>
例如 club 8, heart Q

每次程序開始運行時都會先輸入一個數字

  • 如果是 1 ,則會轉到程序 A ,即 Alice
  • 如果是 2 ,則會轉到程序 B ,即 Bob

請參考程序模板

程序A的輸入

共五行,每行一張牌。

程序A的輸出

共四行,每行一張牌。

程序B的輸入

程序A 的輸出

程序B的輸出

只有一行,為一張牌。

範例

程序A的輸入(測資)

club K
spade A
heart 9
spade 3
diamond 3

程序A的輸出

heart 9
diamond 3
club K
heart 9

程序B的輸入(程序A的輸出)

heart 9
diamond 3
club K
heart 9

程序B的輸出(也就是最終答案)

spade A

程序模板

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

// 變量、函數、結構等可以定義在這裡
// 由於程序A和程序B會分開運行,所以儲存在變量裡的數值會在不同程序之間消失

void program_a() {
    // 程序A
    // 例如
    /*
    int a;
    cin >> a;
    cout << "hello from program a " << a;
    */
}

void program_b() {
    // 程序B
    // 例如
    /*
    int a, b;
    cin >> a >> b;
    cout << "hello from program b " << a + b;
    */
}

// 主程序
int main() {
    int n;
    cin >> n;
    if (n == 1) program_a();
    if (n == 2) program_b();
    return 0;
}

太懶不想寫 .py 模板。

後記 by AlphaBruh

um 比賽的時候反響似乎不太好
本來打算複製這題,做個有部分分的優化版本
但考慮到原本這一題的原意其實就是用部分分引導,就決定不單開了

部分分和特殊評判規則如下:

  • 30%30 \% 的測試點五張牌的點數不超過 66
  • 40%40 \% 的測試點五張牌的點數不超過 77,注意這包括了點數不超過 66 的部分
  • 如果猜測點數錯誤但花色正確,該測試點仍可獲得 40%40\% 的分數