牛客周赛90 C题- Tk的构造数组 题解
原题链接
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;
}