有n张卡片从左往右排成一行,一开始每张卡片都是空白,依次进行如下三个步骤: (一)小A同学给每个卡片都写上一个数字,每个数字都是0至9内的数字,小A保证至少有一张卡片的数字不是0。 (二)小B同学把n张卡片的次序打乱,记这n张卡片的数字从左往右串起来形成一个整数X。小B保证X不会有前导零。 (三)小C同学把n张卡片的次序打乱,记这n张卡片的数字从左往右串起来形成一个整数Y。小C保证Y不会有前导零。 问题是:X与Y的差的绝对值最大可以是多少?输出该最大值。c++
时间: 2024-02-12 15:07:07 浏览: 161
假设X的数字从高位到低位依次为x1, x2, ..., xn,Y的数字从高位到低位依次为y1, y2, ..., yn,则X和Y的差的绝对值为:
|X-Y| = |(x1-y1)*10^(n-1) + (x2-y2)*10^(n-2) + ... + (xn-yn)*10^0|
注意到X和Y的次序都是打乱的,我们可以不妨假设x1 >= x2 >= ... >= xn,y1 >= y2 >= ... >= yn。此时,我们可以得到X和Y的差的绝对值的最大值为:
|X-Y| = (x1-y1)*10^(n-1) + (x2-y2)*10^(n-2) + ... + (xn-yn)*10^0
因为X和Y的次序都是打乱的,所以x1和y1可以是任意两个不同的数字,而其他的数字必须全部相同,否则X和Y的差的绝对值会更小。所以我们可以先将数字从大到小排列,然后枚举x1和y1,其他的数字都相同。具体的做法如下:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int max_abs_diff(vector<int>& nums) {
sort(nums.rbegin(), nums.rend()); // 从大到小排序
int n = nums.size();
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = i+1; j < n; ++j) { // 枚举x1和y1
int diff = (nums[i]-nums[j]) * pow(10, n-1);
for (int k = 0; k < n; ++k) { // 计算差的绝对值
diff += (nums[k] - nums[k< i ? i : j]) * pow(10, n-1-k);
}
ans = max(ans, abs(diff));
}
}
return ans;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
cout << max_abs_diff(nums) << endl;
return 0;
}
```
输入格式为:
```
5
1 2 3 4 5
```
输出结果为:
```
8890
```
其中,数字从大到小排列为5, 4, 3, 2, 1,x1和y1分别为5和4,其他的数字都相同,此时X和Y的差的绝对值为|54321-14532|=8890,是最大的可能值。
阅读全文