202012-2 期末预测之最佳阈值

 

解析:

  这道题没什么难度,主要是读题。明白以下几点:θ取自y,在theta前面的,全部预测为0,剩下的预测为1。这些搞清楚之后就是计算。计算前面结果为0的个数以及后面1的个数,两者之和就是在θi值时,正确的的个数。

注意:

  主要是考虑以下几点:

    1.不能访问过界

    2.注意,当不是结果和预测出现错误时,其累加值为上一个的值。

 1 #include<bits/stdc++.h>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 struct node{
 6     int y;
 7     int result;
 8     int cnt0;
 9     int cnt1;
10     int sum;
11 };
12 bool cmp(node p,node q)
13 {
14     return p.y<q.y;
15 }
16 
17 int main()
18 {
19     int n;
20     cin>>n;
21     vector<node> p;
22     for(int i=0;i<n;i++){
23         node temp;
24         cin>>temp.y>>temp.result;
25         p.push_back(temp);
26     }
27     sort(p.begin(),p.end(),cmp);
28 
29     for(int i=1;i<n;i++){
30         p[i].cnt0=(p[i-1].result==0?(p[i-1].cnt0+1):p[i-1].cnt0);
31     }
32 
33     p[n-1].cnt1=p[n-1].result==0?0:1;
34     for(int i=n-2;i>=0;i--){
35         p[i].cnt1=(p[i].result==1?(p[i+1].cnt1+1):p[i+1].cnt1);
36     }
37     
38     p[0].sum=p[0].cnt0+p[0].cnt1;
39     for(int i=1;i<n;i++){
40         p[i].sum=p[i].cnt0+p[i].cnt1;
41         if(p[i].y==p[i-1].y && p[i].sum>p[i-1].sum){
42             p[i].sum=p[i-1].sum;
43         }
44     }
45     
46     int theta,max_=0;
47     for(int i=0;i<n;i++){
48         if(p[i].sum>=max_){
49             theta=p[i].y;
50             max_=p[i].sum;
51         }
52     }
53     cout<<theta;
54     return 0;
55 }

 另外一种做法

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct student{
    double x;
    double y;
}; 
bool cmp(student x,student y){
    if(x.x!=y.x)
        return x.x<y.x;
    return x.y>y.y;
}
void check(vector<student> v)
{
    cout<<endl;
    for(int i=0;i<v.size();i++){
        cout<<v[i].x<<" "<<v[i].y<<endl;
    }
}
vector<student> input()
{
    vector<student> v;
    int n;
    cin>>n;
    while(n--){
        double x,y;
        cin>>x>>y;
        student s;
        s.x=x;
        s.y=y;
        v.push_back(s);
    }
    sort(v.begin(),v.end(),cmp);
    return v;
}
void compute(vector<student> v)
{
    int cnt=0;
    for(int i=0;i<v.size();i++){
        if(v[i].y==1){
            cnt++;
        }
    }
    int ans=cnt;
    int theta;
    for(int i=1;i<v.size();i++){
        if(v[i-1].y==0)
            cnt++;
        else{
            cnt--;
        }
        if(cnt>=ans){
            ans=cnt;
            theta=v[i].x;
        }
    }
    cout<<theta;
}
int main()
{
    vector<student> v=input();
    compute(v);
    return 0;
    
}

 

posted @ 2021-03-15 21:05  南理工学渣  阅读(84)  评论(0)    收藏  举报