# 题目
6 | |
0 0 | |
1 0 | |
1 1 | |
3 1 | |
5 1 | |
7 1 | |
8 | |
5 1 | |
5 0 | |
5 0 | |
2 1 | |
3 0 | |
4 0 | |
100000000 1 | |
1 0 |
# 理解
题目要求的求最高准确率即为求预测正确的同学的人数,按照安全指数和挂科情况进行排序后,在取定某同学的安全指数作为阈值的情况下,即求数组左侧的 result 值为 0 的同学人数和右侧的 result 值为 1 的人数之和。容易想到用前缀和来解决。
要注意的是,由于正确率公式中存在一个大于等于,所以在排序时,对于具有相同安全指数但 result 值不同的同学,让 result 值为 1 的放在数组前面。
# 解答
#include <iostream> | |
#include <stdio.h> | |
#include <map> | |
#include <algorithm> | |
//#define aaa | |
#define ll long long | |
using namespace std; | |
map<ll, ll> mp; | |
int m; | |
// 选择阈值之后,需要计算正确率 | |
/* | |
* 如果按照安全指数进行排序, | |
* | |
* 对于不同的同学,相同的安全指数可以有不同的结果 | |
* | |
* 右边 1 的个数 | |
* | |
* 左边 0 的个数 | |
* | |
* 必然要遍历所有可能取得的阈值,所以目标是优化求解准确率的过程 | |
* | |
* 两个前缀和数组 sum1 和 sum2 分别表示 0 的个数和 1 的个数 | |
* | |
* 在遍历阈值的时候,判断当前取得的阈值是否和上一次取得的阈值相同,如果相同,则跳过 | |
* | |
* 当安全指数相同而结果不同时,结果为 1 的排在前面。假如为 0 的排在前面 | |
* | |
* 0 0 1 1 | |
* | |
* 1 1 0 0 | |
* | |
* 右边的 1 的个数计算正确,左边 0 的个数计算正确 | |
*/ | |
const int maxm = 100005; | |
struct mate | |
{ | |
ll y; | |
ll result; | |
}mates[maxm]; | |
bool cmp(mate m1, mate m2) { | |
if (m1.y == m2.y) | |
return m1.result > m2.result; | |
else | |
return m1.y < m2.y; | |
} | |
ll sum1[maxm]; //0 的个数 | |
ll sum2[maxm]; //1 的个数 | |
int main() | |
{ | |
#ifdef aaa | |
freopen("stdin.txt", "r", stdin); | |
#endif // aaa | |
cin >> m; //m 为人数 | |
for (int i = 1; i <= m; i++) { | |
ll y, result; | |
cin >> y >> result; | |
mates[i].y = y; | |
mates[i].result = result; | |
} | |
sort(&mates[1], &mates[m + 1], cmp); | |
#ifdef aaa | |
for (int i = 1; i <= m; i++) { | |
cout << mates[i].y << " " << mates[i].result << endl; | |
} | |
cout << "---------" << endl; | |
#endif // aaa | |
// 求出前缀和数组 | |
for (int i = 1; i <= m; i++) { | |
if (mates[i].result) { | |
sum1[i] = sum1[i - 1]; | |
sum2[i] = sum2[i - 1] + 1; | |
} | |
else { | |
sum1[i] = sum1[i - 1] + 1; | |
sum2[i] = sum2[i - 1]; | |
} | |
} | |
// 遍历取阈值 | |
ll pre; // 保存前一步的阈值 | |
ll theta; | |
ll Maxcor; // 最大正确率 | |
for (int i = 1; i <= m; i++) { | |
if (i == 1) { | |
Maxcor = sum2[m] - sum2[i - 1] + sum1[i - 1]; | |
theta = mates[i].y; | |
pre = theta; | |
continue; | |
} | |
if (mates[i].y == pre) | |
continue; | |
pre = mates[i].y; | |
ll curCor = sum2[m] - sum2[i - 1] + sum1[i - 1]; | |
if (Maxcor <= curCor) { | |
theta = mates[i].y; | |
Maxcor = curCor; | |
} | |
} | |
cout << theta; | |
return 0; | |
} |