202012-2:期末预测之最佳阈值
1. pair
的基本用法
1)引入头文件
使用 pair
需要包含 <utility>
头文件:
#include <utility>
2)创建 pair
pair<int, string> p(1, "example");
3)访问 pair
的元素
pair
的两个元素分别是 first
和 second
,可以通过这两个成员变量来访问:
cout << "First: " << p.first << ", Second: " << p.second << endl;
4)修改 pair
的元素
可以直接对 first
和 second
进行赋值:
p.first = 2;
p.second = "new value";
5)常见用法
- 在返回多个值时,使用
pair
是一种常见方式,例如函数返回两个相关联的值:
pair<int, int> getMinMax(int a, int b) {
if (a < b)
return make_pair(a, b);
else
return make_pair(b, a);
}
- 比较
pair
pair
支持比较运算符:==
、!=
、<
、>
、<=
、>=
。比较时会先比较first
,若相等再比较second
:
pair<int, int> p1 = make_pair(1, 5);
pair<int, int> p2 = make_pair(1, 10);
if (p1 < p2) {
cout << "p1 is less than p2";
}
2. 前缀和数组
int s[2][N]
前缀和数组:s[0]
中存储前半段结果,s[1]
中存储后半段结果。
s[0][i - 1]
: 对应
y
<
θ
y<\theta
y<θ (预测为0)且实际结果也为0的情况。
s[1][n] - s[1][i - 1]
: 对应
y
>
=
θ
y>=\theta
y>=θ (预测为1)且实际结果也为1的情况.
注意:前缀和数组一般空出第1位,后续运算比较方便。
3.代码实现
#include <iostream>
#include <utility>
#include <algorithm>
using namespace std;
typedef pair<int, int>PII;
const int N = 100010;
int n;
PII q[N]; // first:yi second:result
int s[2][N]; // 前缀和数组--[2]中分别存储0和1的结果
int main() {
cin >> n;
for (size_t i = 1; i <= n; i++)
{
cin >> q[i].first >> q[i].second;
}
sort(q + 1, q + n + 1);
// 构造前缀和数组--统计的是0的总数和1的总数
for (size_t i = 0; i < 2; i++)
{
for (size_t j = 1; j <= n; j++)
{
s[i][j] = s[i][j - 1] + (q[j].second == i);
}
}
int cnt = -1, res;
for (size_t i = 1; i <= n; i++)
{
// s[0][i - 1]: 对应 y<theta (预测为0)且实际结果也为0的情况
// s[1][n] - s[1][i - 1]: 对应 y>=theta (预测为1)且实际结果也为1的情况
int t = s[0][i - 1] + s[1][n] - s[1][i - 1];
if (t >= cnt)
{
cnt = t;
res = q[i].first; // 更新最佳阈值
}
while (i + 1 <= n && q[i + 1].first == q[i].first)i++; // 跳过相同的yi
}
cout << res;
return 0;
}