https://ac.nowcoder.com/acm/contest/9934/K
读完题就感觉要是结构体排序,你排a或者b都一样。
sort一遍之后,对于每个ai,可以知道你选不选aj(j<i)对于a是没有影响的,但是呢,如果你aj不选,bj就会选上,同时对于k>i的部分b是都选的,所以bj如果比bk大的话就会变成错误答案(bj比bk小就没事),所以我们i前面的部分都选a。
于是对于每个i的答案就是ai+i后面部分b的最大值,也就是ai+max(bi+1,bi+2…bn-1),这里去求max不用从i+1遍历到n-1,我们可以倒着来,从n-1到0,每个i对应的max就是max(bi,max(i+1))。
最后就是遍历一遍去找到每个i对应答案的最小值。这里有个坑点,还有a全选和b全选的情况要考虑进去。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e9 + 1;
struct stu {
long long a;
long long b;
long long maxb;
long long ans;
};
struct stu a[2000001];
bool cmp(stu a, stu b) {
return a.a < b.a;
}
int main() {
int n;
scanf("%d", &n);
long long ma = 0, mb = 0;
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i].a);
ma = max(ma, a[i].a);
}
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i].b);
mb = max(mb, a[i].b);
}
sort(a, a + n, cmp);
long long ANS = N;
for (int i = n - 1; i >= 0 ; i--) {
if (i == n - 1) {
a[i].maxb = a[i].b;
} else {
a[i].maxb = max(a[i].b, a[i + 1].maxb);
}
a[i].ans = a[i].a + a[i + 1].maxb;
}
for (int i = 0; i < n; i++) {
ANS = min(ANS, a[i].ans);
}
ANS = min(ANS, ma);
ANS = min(ANS, mb);
printf("%lld", ANS);
return 0;
}