CCF202012-2 期末预测之最佳阈值
题目
解题思路
针对阈值的话其实核心思路就在于统计所有成绩中,努力程度大于等于阈值的及格人数以及努力程度低于阈值的不及格人数。
然而不难看出,例如努力程度低于3的人,同样是努力程度低于4的人,努力程度高于4的人同样是努力程度高于3的人,只需要一点前缀和的思想,就可以省去一次循环嵌套。
代码如下:
#include<iostream>
#include<set>
#include<map>
using namespace std;
int main(int argc, char const *argv[])
{
int m;
cin>>m;
set<int> Thetas;
map<int, pair<int,int> > Restlts;//first:0 second:1
map<int, int > TMAP;//first:rig second:pass
int Ys,Rts;
for(int i=0;i<m;i++){
cin>>Ys>>Rts;
if(Rts == 0) Restlts[Ys].first++;
else Restlts[Ys].second++;
Thetas.insert(Ys);
}
pair<int,int> MAX(0,0);
int TheLastPass = 0;
set<int>::reverse_iterator rit;
for(rit=Thetas.rbegin();rit!=Thetas.rend();rit++){
TheLastPass+=Restlts[*rit].second;
TMAP[*rit]+=TheLastPass;
//cout<<"努力程度大于等于 "<<*rit<<" 的,及格人数为 "<<TheLastPass<<endl;
}
set<int>::iterator it;
int TheLastREG = 0;
for(it=Thetas.begin();it!=Thetas.end();it++){
TMAP[*it]+=TheLastREG;
//cout<<"努力程度比 "<<*it<<" 低的,未及格人数为 "<<TheLastREG<<endl;
TheLastREG+=Restlts[*it].first;
if(TMAP[*it]>=MAX.second){
MAX.first = *it;
MAX.second = TMAP[*it];
}
}
cout<<MAX.first;
return 0;
}