#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的输入(测资)

1
club K
spade A
heart 9
spade 3
diamond 3

程序A的输出

heart 9
diamond 3
club K
spade 3

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

2
heart 9
diamond 3
club K
spade 3

程序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\% 的分数