70% 暴力搜索
100% 简化搜索过程,按从小到大排序后,后一个值可以从前一个值推出来,不必再次遍历
首先把取得的安全指数和是否及格这两个数据保存在一个vector中,
然后通过sort按从小到大排序。
由于考虑到重复阈值的情况,所以我们通过地图map来显示,这个单体,前一个是阈值,后一个是及格/不及格人数
如果为3,表示所有结果影响为3(不及格人数和及格人数抵消后,还有3人及格),-3,则是3人不及格,0就是不影响。
这样,我们就可以推出前一个和后一个的关系,对前后各种情况做出讨论并求出相应的值。
从最小阈值的开始,那肯定是准确个数就是所有数据中及格的人数
#include<bits/stdc++.h>
using namespace std;
struct node{
int v,w;
};
bool operator<(node &a,node &b)
{
if(a.v<=b.v)
return true;
return false;
}
vector<node> L;
int m;
map<int,int> M;
int main()
{
cin>>m;
int x,y;
int pass=0;
for(int i=0;i<m;i++)
{
cin>>x>>y;
if(y)
pass++;
if(M.find(x)==M.end())
{
M[x]=0;
}
if(y)
M[x]++;
else
M[x]--;
L.push_back({x,y});
}
sort(L.begin(),L.end());
int max=pass;
int ans=L[0].v;
int num=pass;
for(int i=1;i<m;i++)
{
if(L[i].v==L[i-1].v)
continue;
if(M[L[i].v]<0&&M[L[i-1].v]>0)
num-=M[L[i-1].v];
else if(M[L[i].v]>0&&M[L[i-1].v]<0)
num+=(M[L[i-1].v]*-1);
else if (M[L[i].v]<0&&M[L[i-1].v]<0)
num+=(M[L[i-1].v])*-1;
else if (M[L[i].v]>0&&M[L[i-1].v]>0)
num-=M[L[i-1].v];
else if (M[L[i].v]==0&&M[L[i-1].v]>0)
num-=M[L[i-1].v];
else if(M[L[i].v]==0&&M[L[i-1].v]<0)
num+=(M[L[i-1].v]*-1);
if(num>=max)
{
max=num;
ans=L[i].v;
}
}
cout<<ans;
return 0;
}