题解:洛谷 P4414 ABC

【题目来源】

洛谷:P4414 [COCI 2006/2007 #2] ABC - 洛谷

【题目描述】

三个整数分别为 \(A,B,C\)。这三个数字不会按照这样的顺序给你,但它们始终满足条件:\(A\lt B\lt C\)。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。

【输入】

第一行包含三个正整数 \(A,B,C\),不一定是按这个顺序。这三个数字都小于或等于 \(100\)。第二行包含三个大写字母 \(A\)\(B\)\(C\)(它们之间没有空格)表示所需的顺序。

【输出】

在一行中输出 \(A\)\(B\)\(C\),用一个 (空格)隔开。

【输入样例】

1 5 3
ABC

【输出样例】

1 3 5

【核心思想】

  1. 问题分析:给定三个整数(满足 \(A < B < C\) 但输入无序)和一个排序顺序字符串(如 ABCCBA 等),要求按指定顺序输出这三个数。排序后 \(a[0]\) 为最小值,\(a[2]\) 为最大值。

  2. 算法选择

    • 排序 + 映射输出:先将三个数升序排序,再根据输入的顺序字符串确定每个位置输出排序后的哪个元素
  3. 关键步骤

    • 读入数据:三个整数存入数组 \(a[0..2]\),读取顺序字符串 \(s\)
    • 排序sort(a, a + 3) 升序排列,使 \(a[0] < a[1] < a[2]\)
    • 映射输出
      • A 对应 \(a[0]\)(最小值)
      • B 对应 \(a[1]\)(中间值)
      • C 对应 \(a[2]\)(最大值)
    • 根据 \(s\) 的三种字母组合,输出对应的三个数值
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),固定3个数的排序和判断
    • 空间复杂度:\(O(1)\),仅需数组和字符串
  5. 排序映射的核心思想

    • 排序标准化:无论输入顺序如何,排序后 \(a[0], a[1], a[2]\) 分别固定对应最小、中、最大值
    • 字母位置映射A, B, C 不是变量名,而是排序后位置的标识符(第1小、第2小、第3小)
    • 全排列覆盖:6种排列组合(\(3! = 6\))全部用 if-else if 链覆盖,确保任意顺序都能正确输出
    • 适用于排序映射、全排列输出、条件分支类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
#include <algorithm>     // 包含算法库(使用sort函数)
using namespace std;     // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int a[3];           // 定义数组存储3个整数
    string s;           // 定义字符串存储排序顺序

    // 输入3个整数
    for (int i = 0; i < 3; i++)
    {
        cin >> a[i];
    }

    cin >> s;           // 输入排序顺序字符串

    sort(a, a + 3);     // 对数组进行升序排序(a[0]≤a[1]≤a[2])

    // 根据不同的排序顺序输出结果
    if (s == "ABC")
    {
        printf("%d %d %d", a[0], a[1], a[2]);  // 升序输出
    }
    else if (s == "ACB")
    {
        printf("%d %d %d", a[0], a[2], a[1]);  // 小-大-中
    }
    else if (s == "BAC")
    {
        printf("%d %d %d", a[1], a[0], a[2]);  // 中-小-大
    }
    else if (s == "BCA")
    {
        printf("%d %d %d", a[1], a[2], a[0]);  // 中-大-小
    }
    else if (s == "CAB")
    {
        printf("%d %d %d", a[2], a[0], a[1]);  // 大-小-中
    }
    else if (s == "CBA")
    {
        printf("%d %d %d", a[2], a[1], a[0]);  // 降序输出
    }

    return 0;           // 程序正常结束
}

【运行结果】

6 4 2
CAB
6 2 4
posted @ 2026-08-05 15:46  团爸讲算法  阅读(13)  评论(0)    收藏  举报