[COCI 2006/2007 #2] ABC

GitHub跳转原题关系图返回列表

排序三个数后建立 A/B/C 到小中大值的映射,再按给定顺序输出。

OJ: luogu

题目 ID: P4414

难度:入门

标签:python入门排序字典

日期: 2026-07-15 18:17

题意

给出三个数,它们分别是 A < B < C 的某种乱序排列。第二行给出由 A/B/C 组成的输出顺序,要求按这个顺序输出对应数字。

思路

先排序三个数,得到小、中、大。然后建立映射:

  • A -> 最小值
  • B -> 中间值
  • C -> 最大值

最后遍历顺序字符串,输出对应的数字。

brute.py 不适合这题,因为排序和映射就是完整解法。

Python 知识

  • sorted(...) 把三个数排成升序。
  • 字典 named 可以保存字符到数字的映射。
  • print(*(named[ch] for ch in order)) 用星号展开生成器,空格分隔输出多个值。

对应的本地 Python 笔记:

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/sorting_and_ordering.mdsorted 的用法。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/collections_toolkit.md:字典保存键到值的映射。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:输出数组。

代码

python
values = sorted(map(int, input().split()))
order = input()

named = {
    "A": values[0],
    "B": values[1],
    "C": values[2],
}

print(*(named[ch] for ch in order), end="")
cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-27 00:00
 * update_at: 2026-07-27 00:00
 */

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

int main() {
    int a[3]; // 三个数
    cin >> a[0] >> a[1] >> a[2];
    // 排序为 a[0]<=a[1]<=a[2],对应 A(最小) B(中间) C(最大)
    if (a[0] > a[1]) swap(a[0], a[1]);
    if (a[1] > a[2]) swap(a[1], a[2]);
    if (a[0] > a[1]) swap(a[0], a[1]);

    char order[4]; // 输出顺序字符串,如 "ABC"
    cin >> order;
    for (int i = 0; order[i] != '\0'; i++) {
        if (i > 0) cout << " "; // 空格分隔
        if (order[i] == 'A') {
            cout << a[0];
        } else if (order[i] == 'B') {
            cout << a[1];
        } else {
            cout << a[2];
        }
    }
    cout << endl;
    return 0;
}

Pythonic 写法

match-case + print*:

python
a, b, c = sorted(map(int, input().split()))
order = input().strip()

out = []
for ch in order:
    match ch:
        case "A":
            out.append(a)
        case "B":
            out.append(b)
        case "C":
            out.append(c)

print(*out, end="")

match-case 写法

输出顺序中的 A/B/C 可用 match ch 映射到已排序的小中大:

python
a, b, c = sorted(map(int, input().split()))
order = input().strip()

out = []
for ch in order:
    match ch:
        case "A":
            out.append(a)
        case "B":
            out.append(b)
        case "C":
            out.append(c)

print(*out, end="")

复杂度

只处理三个数,时间复杂度 O(1)O(1),空间复杂度 O(1)O(1)

总结

当题目给出符号顺序时,可以先把符号映射到实际值,再按顺序查表输出。字典能让这种对应关系很清楚。