题解:洛谷 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
【核心思想】
-
问题分析:给定三个整数(满足 \(A < B < C\) 但输入无序)和一个排序顺序字符串(如
ABC、CBA等),要求按指定顺序输出这三个数。排序后 \(a[0]\) 为最小值,\(a[2]\) 为最大值。 -
算法选择:
- 排序 + 映射输出:先将三个数升序排序,再根据输入的顺序字符串确定每个位置输出排序后的哪个元素
-
关键步骤:
- 读入数据:三个整数存入数组 \(a[0..2]\),读取顺序字符串 \(s\)
- 排序:
sort(a, a + 3)升序排列,使 \(a[0] < a[1] < a[2]\) - 映射输出:
A对应 \(a[0]\)(最小值)B对应 \(a[1]\)(中间值)C对应 \(a[2]\)(最大值)
- 根据 \(s\) 的三种字母组合,输出对应的三个数值
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定3个数的排序和判断
- 空间复杂度:\(O(1)\),仅需数组和字符串
-
排序映射的核心思想:
- 排序标准化:无论输入顺序如何,排序后 \(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
浙公网安备 33010602011771号