原题链接
https://ac.nowcoder.com/acm/contest/107500/C
题目描述
解题思路
数组a是不可以动的,所以我们可以把a[i]*b[i]*i分成两组,分别为a[i]*i以及b[i]
然后策略就很明显了,让更大的b[i]匹配更大的a[i]*i
详细实现见代码。
代码(CPP)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
#define endl "\n"
const int maxn = 2e5 + 10;
const ll INF = 0x3f3f3f3f3f3f3fLL;
struct Num {
ll x;
int idx;
} a[maxn];
ll b[maxn], n;
ll ans[maxn];
bool cmp(Num &num1, Num &num2) {
return num1.x * num1.idx > num2.x * num2.idx;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].x;
a[i].idx = i;
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
/*
数组a是不可以动的,所以我们可以把a[i]*b[i]*i分成两组,分别为a[i]*i以及b[i],
然后策略就很明显了,更大的b[i]匹配更大的a[i]*i
*/
sort(a + 1, a + n + 1, cmp);
sort(b + 1, b + n + 1, greater<int>());
for (int i = 1; i <= n; i++) {
ans[a[i].idx] = b[i];
}
for (int i = 1; i <= n; i++) {
if (i != 1)
cout << " ";
cout << ans[i];
}
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout << fixed;
cout.precision(18);
solve();
return 0;
}