题解 | 请客吃饭
请客吃饭
https://www.nowcoder.com/practice/4250a369235e414ba9128bb23ff4fcf5
#include <bits/stdc++.h> using namespace std; #define int long long int ans = 1e9 + 5; //最小隔阂 int maxhp = 0; //最大愉悦 void solve() { int n, k; cin >> n >> k; vector<pair<int,int>> a(n + 1,{0,0}), b(n + 1, {0,0}); for (int i = 1; i <= n; i++) //输入财富,second是下表 { cin >> a[i].first; a[i].second = i; } for (int i = 1; i <= n; i++) //输入愉悦值,second是下表 { cin >> b[i].first; b[i].second = i; } sort(a.begin() + 1, a.begin() + 1 + n); //按照财富排序 vector<int> pre(n + 1, 0); for (int i = 1; i <= n; i++) //财富排序后的愉悦值前缀和 { int idx = a[i].second; pre[i] = b[idx].first + pre[i - 1]; } int l = 1, r = 1; while (l <= n && r <= n) { int idxr = a[r].second, idxl = a[l].second; //计算原始下表 int hp = pre[r] - pre[l - 1]; //计算愉悦值 if (hp < k) { r++; } else { if (hp >= maxhp) ans = min(ans, abs(a[r].first - a[l].first)); //更新最小隔阂 else maxhp = hp; l++; } } if (ans == 1e9 + 5) cout << -1; else std::cout << ans << endl; } signed main() { solve(); return 0; }