1.题目
202012-2 期末预测之最佳阈值
2.数据结构与算法
DS:vector
A:
1.读入数据
2.排序
3.数据获取
4.数据处理(双指针)
3.源代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct data{
int y; //安全指数
int result; //是否挂科
int num_0; //当前元素及当前元素之前有多少个 result==0
int num_1; //当前元素及当前元素之前有多少个 result==1
};
bool tmp(const data &a,const data &b){
return a.y < b.y;
}
int main()
{
int n;
cin>>n;
vector<data> v;
data a;
a.num_0 = 0; a.num_1 = 0;
for(int i=0; i<n; i++){
cin>>a.y>>a.result;
v.push_back(a);
}
//排序
sort(v.begin(), v.end(), tmp);
//数据获取
int numa_0 = 0;
int numa_1 = 0;
for(int i=0; i<n; i++){
(v[i].result == 0)? numa_0++ : numa_1++;
v[i].num_0 = numa_0;
v[i].num_1 = numa_1;
}
int num_1 = numa_1;//记录1的总数
//数据处理
int max_x, max_times = 0;//最大预测正确次数的阈,最大预测正确的次数。(paint策略)
int p1=0, p2=0;
while(p2 < n){
int x = v[p1].y;
int times = 0;
if(v[p1].y != v[p2].y){
if(p1 == 0){
times = num_1;
}else{
times = v[p1-1].num_0 + num_1 - v[p1-1].num_1;
}
if(times >= max_times){
max_x = x;
max_times = times;
}
p1 = p2;
}
p2++;
}
if(p2 == n){
int x = v[p1].y;
int times = v[p1-1].num_0 + num_1 - v[p1-1].num_1;
if(times >= max_times){
max_x = x;
max_times = times;
}
}
cout<<max_x;
return 0;
}
4.时间复杂度
排序
ο
(
n
l
o
g
n
)
+
\omicron(nlogn)+
ο(nlogn)+数据处理
ο
(
n
)
\omicron(n)
ο(n)
时间复杂度:
ο
(
n
l
o
g
n
)
\omicron(nlogn)
ο(nlogn)