排序题。
- 把数组 a 按照 a[i] * i 的大小进行升序排序。
- 把数组 b 按照 b[i] 的大小进行升序排序。
- 此时从 1 ~ n, 保证所有 a[i] * b[i] * i 的总和是最大的。
- 题目仅要求把数组 b 重新排序,故开一个空数组 c, 从 1 ~ n, 让 c[a[i].se] = b[i]。其中 a[i].se 指的是 a[i] 升序排序前最初的下标。
- 存完后的数组 c 就等价于数组 b 对应数组 a 最初状态下排序的结果,即 b[i] 的最大值 对应 a[i] * i 的最大值,b[i] 的最小值 对应 a[i] * i 的最小值,输出即可。
附:a[i] * i 可能会超出 int 范围,运算过程中需要 * 1LL 临时转化为 long long 。
#include <iostream>
#include <algorithm>
#include <utility>
#define fi first
#define se second
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int N = 2e5 + 10;
pii a[N];
int b[N], c[N];
bool cmp(pii& x, pii& y) {
return 1LL * x.fi * x.se < 1LL * y.fi * y.se;
}
int main() {
int n; cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i].fi;
a[i].se = i;
}
for(int i = 1; i <= n; i++) cin >> b[i];
sort(a + 1, a + n + 1, cmp);
sort(b + 1, b + n + 1);
for(int i = 1; i <= n; i++) c[a[i].se] = b[i];
for(int i = 1; i <= n; i++) cout << c[i] << " ";
return 0;
}