期末预测之最佳阈值 C++

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值