第一题
简单模拟
代码如下:
int n, y[100010], result[100010], mx = 0, _theta = -1;
int main(){
scanf("%d", &n);
for(int i = 1 ; i <= n ; i++){
scanf("%d%d", &y[i], &result[i]);
}
for(int i = 1; i <= n ; i ++ ) {
int theta = y[i], curr = 0;
for(int j = 1 ; j <= n ; j++){
if(y[j] >= theta && result[j] == 1 || y[j] < theta && result[j] == 0)
curr ++;
}
if(curr >= mx){
mx = curr;
if(_theta < theta)
_theta = theta;
}
}
cout << _theta;
}
第二题 期末预测之最佳阈值
用到了“前缀和”的算法,对要处理的数据排序后再运算;
设s[2][N],
s[0][k]代表第k位之前有s[0][k]个“0”,
s[1][k]代表第k位之前有s[1][k]个“1”
第k个数据可以正确预测的数量为
小于k且挂科的人数 + 大于等于k且没挂科的人数
s[0][k - 1] + ( s[1][n] - s[1][k - 1] )
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 200010;
int n ,p[2][N];
PII A[N];
int main(){
scanf("%d", &n);
for(int i = 1 ; i <= n; i++){
scanf("%d%d", &A[i].x, &A[i].y);
}
sort(A + 1, A + n + 1); //给数据排序,优先按照x也即θ值升序排序
for(int i = 0 ; i < 2 ; i ++){
for(int j = 1; j <= n ; j ++){
//计算p[i][j]的值,用到了前缀和,注意后一项是 “==”,只会是0或1
p[i][j] = p[i][j - 1] + (A[j].y == i);
}
}
int mx = 0, res = 0;
for(int i = 1; i <= n ; i++ ){
//curr 代表第 i 个数据可以正确预测的数量
int curr = p[0][i - 1] + p[1][n] - p[1][i - 1];
if( curr >= mx){
mx = curr, res = A[i].x;
}
//由于相同的θ会影响结果,所以跳过相同部分
while( i + 1 <= n && A[i].x == A[i + 1].x) i ++;
}
cout <<res;
}