今天在洛谷上遇到了一道很有意思的题
题目:
【题目描述】
三个整数分别为 A,B,C。这三个数字不会按照这样的顺序给你,但它们始终满足条件:A<B<C。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。
【输入格式】
第一行包含三个正整数A,B,C,不一定是按这个顺序。这三个数字都小于或等于 100100。第二行包含三个大写字母 A、B 和 C(它们之间没有空格)表示所需的顺序。
【输出格式】
在一行中输出 A,B 和 C,用一个 (空格)隔开。
意思很简单:给你三个数分别代表ABC,但并不是第一个数就是A,第二个数是B这样的,而 A是最小的B是第二小的,而C是最大的。再给你一行字母,让你按照字母的顺序将数字输出。
题解:
所谓ABC,就是这三个数的max,mid和max,所以我们只需要将这三个数算出来就可以了。
max和min相信大家都会算,而mid则就需要一些取巧的办法了。
很简单,因为只有三个数,如果a!=max&&a!=min,那么a就是mid了,同理bc一样
需要注意的一点是:最开始的时候我将Mid函数写成了a<=max&&a>=min,导致的最直接的后果就是如果a就是最大值或最小值的话那就不会进行比较,函数直接返回a,导致结果错误。
最后上代码
#include <iostream>
using namespace std; int Max(int a, int b, int c)
{int d = a > b ? a : b;return c > d ? c : d;
}
int Min(int a, int b, int c)
{int d = a < b ? a : b;return c < d ? c : d;
}
int Mid(int a, int b, int c)
{int max = Max(a, b, c);int min = Min(a, b, c);if (a != min && a != max){return a;}if (b != min && b != max){return b;}if (c != min && c != max){return c;}
}
int main()
{int a, b, c;cin >> a >> b >> c;int max = Max(a, b, c);int min = Min(a, b, c);int mid = Mid(a, b, c);char ch[3];for (int i = 0; i < 3; i++){cin >> ch[i];}for (int i = 0; i < 3; i++){if (ch[i] == 'A'){cout << min<<" ";}if (ch[i] == 'B'){cout << mid << " ";}if (ch[i] == 'C'){cout << max << " ";}}return 0;
}