用前缀和求解
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
pair<int, int>p[100020];
int a, b;
for (int i = 1; i <= n; i++) {
cin >> a >> b;
p[i]=make_pair(a, b);
}
int max_size = 0;
int index = 0;
sort(p+1, p + n+1);
int sum[100020] = { 0 };
for (int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + p[i].second;
}set<int>st;
int f1 = 0, f2 = 0, f = 0;
for (int i = 1; i <= n; i++) {
a = p[i].first;//选取阈值
if (st.count(a)) continue;//set去重
st.insert(a);
f2 = sum[n] - sum[i-1];
f1 = i - 1 - sum[i - 1];
f = f1 + f2;
if (max_size <= f) {
max_size = f;
index = i;
}
}
cout << p[index].first;
return 0;
}
二刷
#include<bits/stdc++.h>
using namespace std;
int m;
pair<int, int>p[100010];
int d[100010] = { 0 };
int sum[100010] = { 0 };
bool cmp(pair<int,int> a, pair<int,int> b) {
if (a.first != b.first) {
return a.first < b.first;
}
else {
return a.second < b.second;
}
}
int main() {
cin >> m;
int i;
for (i = 1; i <= m; i++) {
cin >> p[i].first >> p[i].second;
}
sort(p+1, p +1+ m, cmp);
for (i = 1; i <= m; i++) {
d[i] = p[i].second;
sum[i] = sum[i - 1] + d[i];
}
set<int>s;
int max_sum = 0;
int max_i = 0;
for (i = 1; i <= m; i++) {
int f1 = 0, f2 = 0, f = 0;
int a = p[i].first;
if (s.count(a))continue;
s.insert(a);
f1 = i - sum[i - 1]-1;
f2 = sum[m] - sum[i - 1];
f = f1 + f2;
if (max_sum <= f) {
max_sum = f;
max_i = i;
}
}
cout << p[max_i].first;
}