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; }

浙公网安备 33010602011771号