AcWing 3298. 期末预测之最佳阈值
原题链接
中等
作者:
尘轩
,
2024-10-28 12:22:05
,
所有人可见
,
阅读 4
前缀和+双指针
#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;
#define x first
#define y second
typedef pair<int, int> PII;
int m;
PII cnt[N];
int s[N], res[N];
int main()
{
cin >> m;
for (int i = 1; i <= m; i ++) cin >> cnt[i].x >> cnt[i].y;
sort(cnt + 1, cnt + m + 1);
// 预处理前i个人中有多少个没有挂科,那么前i个中其他的就是挂科的
for (int i = 1; i <= m; i ++) s[i] = cnt[i].y + s[i - 1];
// 因为存在安全指数相同的情况,用双指针进行处理
// 统计每个安全指数作为阈值时,预测正确的次数
for (int i = 1, j = 1; j <= m;) {
if (cnt[i].x == cnt[j].x) {
int tmp = i - 1 - s[i - 1];
tmp += s[m] - s[i - 1];
res[j] += tmp;
j ++;
}
else {
int tmp = j - 1 - s[j - 1];
tmp += s[m] - s[j - 1];
res[j] += tmp;
i = j;
j ++;
}
}
// 选出最佳阈值
int t = 0;
for (int i = 1; i <= m; i ++) {
if (res[i] >= res[t]) t = i;
}
cout << cnt[t].x << endl;
return 0;
}